設計模式 - 建造者模式(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 建造者模式
抽象工廠模式實現對產品家族的創建,一個產品家族是這樣的一系列產品:具有不同分類維度的產品組合,採用抽象工廠模式不需要關係構建過程,只關心什麼產品由什麼工廠生產。
構造者模式要求按照指定的藍圖構造產品,它的主要目的是通過組裝零配件產品一個新的產品
抽象工廠類似麪包房製作各種麪包,構造者模式更新汽車的組裝