設計模式之建造者模式(建立型)
模式定義
建造者模式屬於23種設計模式中的建立型模式,可以理解為建立物件的一種很好的方法。
所謂建造者模式就是將元件和元件的元件過程分開,然後一步一步建造一個複雜的物件。所以建造者模式又叫生成器模式。
建造者模式類圖
模式結構
建造者模式包含如下角色
Builder:抽象建造者
ConcreteBuilder:具體建造者
Director:指揮者
Product:產品角色
如果系統只需要一個具體的建造者類的時候,可以省略抽象建造者,有時候指揮者類也可以省略,讓建造者類同時充當指揮者和建造者
簡單例項
下面給出一個簡單例子
產品角色類
public class Product
{
private String partA;
private String partB;
private String partC;
//...省略set、get方法
}
抽象建造者類定義了產品的建立方法和返回方法
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 ConcreteBuilder implements Builder {
Part partA, partB, partC;
public void buildPartA() {
//這裡是具體如何構建partA的程式碼
};
public void buildPartB() {
//這裡是具體如何構建partB的程式碼
};
public void buildPartC() {
//這裡是具體如何構建partB的程式碼
};
public Product getResult() {
//返回最後組裝成品結果
};
}
指揮者類,一方面它隔離了客戶與生產過程;另一方面它負責控制產品的生成過程
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 ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
應用
最常見的就是StringBuilder;
JDBC的PreparedStatement類
螞蟻金服的螞蟻莊園小雞的裝扮實現可以通過建造者模式設計
優缺點
優點:
客戶端不必知道產品內部組成的細節,將產品本身與產品的建立過程解耦。
增加新的具體建造者無須修改原有類庫的程式碼,指揮者類針對抽象建造者類程式設計,系統擴充套件方便,符合“開閉原則”。
缺點:
如果內部建造元件的方法經常變動,這種情況就不適合建造者模式了
建造者模式雖然很好的解耦,但是和單例模式比起來,可能造成過多的建立類物件,給JVM造成負載,當然在適當的場景應用也是可以提高效能的,比如StringBuilder的應用
模式比較
通過學習,我們發現建造模式和抽象工廠模式似乎有點類似,所以我們對比一下兩種模式
抽象工廠模式:在客戶端呼叫時,只是例項工廠類,然後呼叫工廠類對應的方法
建造者模式:在客戶端呼叫時,可以通過指揮者指揮生成物件,返回的是一個完整的物件