天天看點

java設計模式-建造者模式java設計模式-建造者模式

java設計模式-建造者模式

文章目錄

  • java設計模式-建造者模式
    • 概念
    • 例子一
    • 方式二
    • 與抽象工廠的比較

概念

  • 建造者模式也屬于建立型模式,它提供了一種對象的最佳方式。
定義:将一個複雜對象的構造與它的表示分離,使得同樣的建構過程可以建立不同的表示
  • 主要作用:在使用者不知道對象的建造過程和細節 的情況下就可以直接建立複雜的對象。
  • 使用者隻需要給出指定複雜對象的類型和内容,建造者模式負責按順序建立對象(把内部的建造過程和細節隐藏起來)
  • 例子 :
  • 工廠(建造者模式)∶負責制造汽車(組裝過>程和細節在工廠内)
  • 汽車購買者(使用者)︰你隻需要說出你需要的>型号((對象的類型和内容),然後直接購買就可以使用了(不需要知道汽車是怎麼組裝的(車輪、車門、>發動機、方向盤等等))
java設計模式-建造者模式java設計模式-建造者模式

既然是建造者模式,那麼我們還是繼續造房吧,其實我也想不到更簡單的例子。假設造房簡化為如下步驟:

(1)地基

(2)鋼筋工程

(3)鋪電線

(4)粉刷;

如果 要蓋一座房子,首先要找一個建築公司或工程承包商(指揮者)。承包商指揮勞工(具體建造者)過來造房子(産品),最後驗收。

例子一

//抽象的建造者
public abstract class Builder {
    abstract void  BuilderA();//地基
    abstract void  BuilderB();//鋼筋水泥
    abstract void  BuilderC();//鋪電線
    abstract void  BuilderD();//粉刷
    //完工:得到産品
    abstract Product getProduct();
}
           

具體的勞工

//具體的勞工
public class Worker extends Builder{

    private Product product;

    public Worker(){
        product=new Product();
    }

    @Override
    void BuilderA() {
        product.setBuilderA("地基");
        System.out.println("地基建造完成");
    }

    @Override
    void BuilderB() {
        product.setBuilderB("鋼筋工程");
        System.out.println("鋼筋工程完成");
    }

    @Override
    void BuilderC() {
        product.setBuilderC("浦電線");
        System.out.println("浦電線完成");
    }

    @Override
    void BuilderD() {
        product.setBuilderD("粉刷");
        System.out.println("粉刷完成");

    }
	//獲得産品
    @Override
    Product getProduct() {
        return product;
    }
}
           

産品:房子

public class Product {

    private String BuilderA;
    private String BuilderB;
    private String BuilderC;
    private String BuilderD;

   // 略... set get方法
}
           

指揮者

//指揮:指揮建構工程  如何建構由他決定
public class Director {
    //指揮勞工 按照順序建房子
    public Product build(Builder builder){
        builder.BuilderA();
        builder.BuilderB();
        builder.BuilderC();
        builder.BuilderD();
        return builder.getProduct();
    }
}
           

測試

public static void main(String[] args) {
        //指揮
        Director director=new Director();
        //指揮指揮勞工建立房子
        Product build = director.build(new Worker());
        //列印房子
        System.out.println(build.toString());
    }
           
java設計模式-建造者模式java設計模式-建造者模式

方式二

實作零件無序裝配構造,這種方式使用更加靈法,更符合定義。内部有複雜對象的預設實作,使用時可以根據使用者需求自由定義更改内容,并且無需改變具體的構造方式。就可以生産出不同複雜産品

比如:麥當勞的套餐,服務員(具體建造者)可以随意搭配任意幾種産品(零件)組成一款套菱(産品),然後出售給客戶。比第一種方式少了指揮者,主要是因為第二種方式把指揮者交給使用者來操作,使得産品的建立更加簡單靈活。

建造者

//建造者
public abstract class Builder {
    abstract Builder builderA(String msg);//漢堡
    abstract Builder builderB(String msg);//可樂
    abstract Builder builderC(String msg);//薯條
    abstract Builder builderD(String msg);//甜點

    abstract Product getProduct();
}
           

具體的實作構造者 服務員

//具體的建造者
public class Worker extends Builder{

    private Product product;

    //建造者建立産品
    public Worker(){
        product=new Product();
    }

    @Override
    Builder builderA(String msg) {
        product.setBuildA(msg);
        return this;
    }

    @Override
    Builder builderB(String msg) {
        product.setBuildB(msg);
        return this;
    }

    @Override
    Builder builderC(String msg) {
        product.setBuildC(msg);
        return this;
    }

    @Override
    Builder builderD(String msg) {
        product.setBuildD(msg);
        return this;
    }

    @Override
    Product getProduct() {
        return product;
    }
}
           

具體的産品

//産品:套餐
public class Product {
	//沒有設定就是預設的
    private String BuildA="漢堡";
    private String BuildB="可樂";
    private String BuildC="薯條";
    private String BuildD="甜點";
    //...略一些setget方法
    }
           

測試

public static void main(String[] args) {
        //服務員
        Worker worker=new Worker();
        Product product = worker.getProduct();
        //指揮者就是服務員  沒有設定值就是預設的
        System.out.println(product.toString());

        //建構的順序由客戶指揮  在原來的基礎上自由組合,如果不組合,就是預設的套餐
        Product product1 = worker.builderA("漢堡包").builderC("全家桶").builderD("薯片")
                .getProduct();
        System.out.println(product1.toString());
    }
           

與抽象工廠的比較

java設計模式-建造者模式java設計模式-建造者模式