轉自:http://www.runoob.com/design-pattern/builder-pattern.html
建造者(Builder Pattern)模式屬于對象的建立模式,可以分布建構對象,将一個對象的屬性與對象的建立周期分割開來,進而在建立過程中生成具有不同屬性的對象。
介紹
意圖:将一個複雜的建構與其表示相分離,使得同樣的建構過程可以建立不同的表示。
主要解決:主要解決在軟體系統中,有時候面臨着"一個複雜對象"的建立工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是将它們組合在一起的算法卻相對穩定。
何時使用:一些基本部件不會變,而其組合經常變化的時候。
如何解決:将變與不變分離開。
關鍵代碼:建造者:建立和提供執行個體,導演:管理建造出來的執行個體的依賴關系。
應用執行個體: 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder。
優點: 1、建造者獨立,易擴充。 2、便于控制細節風險。
缺點: 1、産品必須有共同點,範圍有限制。 2、如内部變化複雜,會有很多的建造類。
使用場景: 1、需要生成的對象具有複雜的内部結構。 2、需要生成的對象内部屬性本身互相依賴。
注意事項:與工廠模式的差別是:建造者模式更加關注與零件裝配的順序。
三個角色:建造者、具體的建造者、監工、使用者(嚴格來說不算)
- 建造者角色:定義生成執行個體所需要的所有方法;
- 具體的建造者角色:實作生成執行個體所需要的所有方法,并且定義擷取最終生成執行個體的方法;
- 監工角色:定義使用建造者角色中的方法來生成執行個體的方法;
- 使用者:使用建造者模式。
建造者角色:
package com.wlz;
/**
* @author zhiqiang zhang
* @create 2019-02-15-12:49
**/
public abstract class Builder {
public abstract void buildPart1();
public abstract void buildPart2();
public abstract void buildPart3();
}
監工角色:
package com.wlz;
/** 監工角色
* @author zhiqiang zhang
* @create 2019-02-15-12:53
**/
public class Director {
//對象屬性
private Builder builder;
//構造器
public Director(Builder builder){
this.builder=builder;
}
public Builder getBuilder() {
return builder;
}
public void setBuilder(Builder builder) {
this.builder = builder;
}
//定義一個建構過程
public void construct(){
builder.buildPart1();
for(int i=0;i<5;i++){
builder.buildPart2();
}
builder.buildPart3();
}
}
具體建造者:
package com.wlz;
/** 具體的建造者角色
* @author zhiqiang zhang
* @create 2019-02-15-13:06
**/
public class ConcreteBuilder1 extends Builder {
@Override
public void buildPart1() {
System.out.println("構模組化塊一");
}
@Override
public void buildPart2() {
System.out.println("構模組化塊二");
}
@Override
public void buildPart3() {
System.out.println("構模組化塊三");
}
}
測試:
public static void TestBuilder(){
//建造者
ConcreteBuilder1 concreteBuilder1=new ConcreteBuilder1();
//監工
Director director=new Director(concreteBuilder1);
//建造執行個體
director.construct();
}
運作結果:
構模組化塊一
構模組化塊二
構模組化塊二
構模組化塊二
構模組化塊二
構模組化塊二
構模組化塊三
擴充
建造者模式的簡化:
- 省略抽象建造者角色:如果系統中隻需要一個具體建造者的話,可以省略掉抽象建造者。
- 省略指揮者角色:在具體建造者隻有一個的情況下,如果抽象建造者角色已經被省略掉,那麼還可以省略指揮者角色,讓
Builder角色扮演指揮者與建造者雙重角色。
建造者模式與抽象工廠模式的比較:
- 與抽象工廠模式相比, 建造者模式傳回一個組裝好的完整産品,而 抽象工廠模式傳回一系列相關的産品,這些産品位于不同的産品等級結構,構成了一個産品族。
- 在抽象工廠模式中,用戶端執行個體化工廠類,然後調用工廠方法擷取所需産品對象,而在建造者模式中,用戶端可以不直接調用建造者的相關方法,而是通過指揮者類來指導如何生成對象,包括對象的組裝過程和建造步驟,它側重于一步步構造一個複雜對象,傳回一個完整的對象。
- 如果将抽象工廠模式看成 汽車配件生産工廠 ,生産一個産品族的産品,那麼建造者模式就是一個 汽車組裝工廠 ,通過對部件的組裝可以傳回一輛完整的汽車。