模式動機
建造者模式(Builder Pattern)是最複雜的建立型模式,它用於建立一個包含多個組成部分的複雜物件,可以返回一個完整的產品物件給使用者。它透過將客戶端與包含多個組成部分的複雜物件的建立過程分離,使得客戶端無需知道複雜物件的內部組成部分與裝配方式,只需要知道建造者的型別即可。它關注如何一步一步建立一個複雜物件,不同的具體建造者定義了不同的建立過程,且具體建造者相互獨立,增加新的建造者非常方便,系統具有較好的擴充套件性。
模式定義
- 建造者模式(Builder Pattern):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
- 建造者模式是一步一步建立一個複雜的物件,它允許使用者只透過指定複雜物件的型別和內容就可以構建它們,使用者不需要知道內部的具體構建細節。建造者模式屬於物件建立型模式。
模式結構
模式分析
產品:一個由多種元件組合生成的複雜物件
public class Product {
private String partA; //定義部件,部件可以是任意型別,包括值型別和引用型別
private String partB;
private String partC;
//partA的Getter方法和Setter方法省略
//partB的Getter方法和Setter方法省略
//partC的Getter方法和Setter方法省略
}
抽象建造者
public abstract class Builder {
//建立產品物件
protected Product product=new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回產品物件
public Product getResult() {
return product;
}
}
具體建造者
public class ConcreteBuilder1 extends Builder{
public void buildPartA() {
product.setPartA("A1");
}
public void buildPartB() {
product.setPartB("B1");
}
public void buildPartC() {
product.setPartC("C1");
}
}
指揮者
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder=builder;
}
public void setBuilder(Builder builder) {
this.builder=builer;
}
//產品構建與組裝方法
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
客戶
......
Builder builder = new ConcreteBuilder1(); //可透過配置檔案實現
Director director = new Director(builder);
Product product = director.construct();
......
-
模式優點
- 客戶端不必知道產品內部組成的細節,將產品本身與產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件
- 每一個具體建造者都相對獨立,與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,擴充套件方便,符合開閉原則
- 可以更加精細地控制產品的建立過程
-
模式缺點
- 建造者模式所建立的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,不適合使用建造者模式,因此其使用範圍受到一定的限制
- 如果產品的內部變化複雜,可能會需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大,增加了系統的理解難度和執行成本
-
在以下情況下可以使用建造者模式
簡化
- 省略抽象建造者角色-(系統中只需要1個建造者時)
- 省略指揮者角色-(系統中只需要1個建造者是,省略抽象建造者、還可繼續省略指揮者,讓Builder角色扮演指揮者與建造者雙重角色