設計模式 - 建造者模式(Builder Pattern)

設計模式 - 建造者模式(Builder Pattern)

一、基本介紹

建造者模式(生成器模式):是一種對象構建模式。可以將複雜對象的構造過程抽象出來,使這個抽象過程的不同實現方法可以構造出不同屬性的對象。

構建者模式 是一步步創建一個複雜的對象,運行用戶只通過指定複雜對象的類型 和內容 就可以構建他們,用戶不需要知道內部的具體細節

建造者模式中的四個對象

  • Product(產品角色):一個具體的產品對象
  • Builder(抽象建築者):實現一個Production 對象的各個部件指定的接口 / 抽象類
  • ConcreateBuilder(具體構建者 ):實現接口,構建和裝配各個接口
  • Director(指揮者):構建一個使用Builder接口對象。主要是用於構建個一個複雜對象。有兩個作用:
    • 隔離客戶和對象的成產過程
    • 負責控制產品對象的生產過程

二、簡單的Demo

下面提供一個樣例可以體會一下

class Client {
    public static void main(String[] args) {
        //建造普通房子
        CommonHouse commonHouse = new CommonHouse();
        // 準備創建房子的指揮者
        HouseDirector houseDirector = new HouseDirector(commonHouse);
        // 返回蓋房子
        House house = houseDirector.createHouse();
        System.out.println(house);
    }
}

class HouseDirector extends Client {
    HouseBuilder houseBuilder = null;

    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    // 如何處理建造房子的流程
    public House createHouse() {
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.build();
    }

}

@Data
@ToString
class House {
    private String basic;
    private Integer wall;
    private String roofed;
}

class HighHouse extends HouseBuilder {

    @Override
    void buildBasic() {

        System.out.println("high house build basic");
    }

    @Override
    void buildWalls() {
        System.out.println("high house build wall");
    }

    @Override
    void roofed() {
        System.out.println("high house roofed");
    }
}

class CommonHouse extends HouseBuilder {

    @Override
    void buildBasic() {
        super.house.setBasic("common house basic");
        System.out.println("common house build basic");
    }

    @Override
    void buildWalls() {
        super.house.setWall("common house");
        System.out.println("common house build wall");
    }

    @Override
    void roofed() {
        System.out.println("common house roofed");
    }
}

abstract class HouseBuilder {
    protected House house = new House();

    abstract void buildBasic();

    abstract void buildWalls();

    abstract void roofed();

    public House buildHouse() {
        return house;
    }

    public House build() {
        return house;
    }
}

三、注意事項

  • 客戶端不必知道產品內部組成的字節,將產品本身和產品的創建過程解耦,使相同的創建過程可以構建不同的產品對象,說白了就是 真正創建對象的時候只需要 告訴 Director我要什麼 (調方法)具體的過程不用管,交給 ConcreateBuilder

  • 每個具體構建者都相對獨立,而與其他的具體構建者無關,因此可以很方便地替換具體構建者或者增加新的構造者,只要使用不同的具體構造者就可以得到不同的產品對象

  • 可以更加精細地控制產品的創建過程。將複雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰,也更方便使用程序來控制創建過程

  • 增加新的具體構造者不用修改原有類庫的代碼,指揮者針對抽象構造者編程,系統擴展方便,符合“開閉原則”。

  • 構建者模式 創建 的產品一般具有較多的共同點,他們 的組成部分相似,如果產品之間的差異很大,不適合使用構建者模式

  • 如果產品的內部變化複雜,可以會導致需要定義很多具體構造者類來實現這種變化,導致系統變得很龐大,因此在這種情況下考慮是否選擇構建者模式

  • 抽象工廠模式 VS 建造者模式

    抽象工廠模式實現對產品家族的創建,一個產品家族是這樣的一系列產品:具有不同分類維度的產品組合,採用抽象工廠模式不需要關係構建過程,只關心什麼產品由什麼工廠生產。

    構造者模式要求按照指定的藍圖構造產品,它的主要目的是通過組裝零配件產品一個新的產品

    抽象工廠類似麪包房製作各種麪包,構造者模式更新汽車的組裝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章