1. 程式人生 > >設計模式之建造者模式(創建型)

設計模式之建造者模式(創建型)

修改 發現 text href cto stat mar public geek

模式定義

建造者模式屬於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種設計模式

設計模式之建造者模式(創建型)