設計模式之建造者模式(創建型)
模式定義
建造者模式屬於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的應用
模式比較
通過學習,我們發現建造模式和抽象工廠模式似乎有點類似,所以我們對比一下兩種模式
抽象工廠模式:在客戶端調用時,只是實例工廠類,然後調用工廠類對應的方法
建造者模式:在客戶端調用時,可以通過指揮者指揮生成對象,返回的是一個完整的對象
參考教程
建造者模式
設計模式之禪
23種設計模式
設計模式之建造者模式(創建型)