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

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

模式定義

建造者模式屬於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的應用

模式比較

通過學習,我們發現建造模式和抽象工廠模式似乎有點類似,所以我們對比一下兩種模式

抽象工廠模式:在客戶端呼叫時,只是例項工廠類,然後呼叫工廠類對應的方法
建造者模式:在客戶端呼叫時,可以通過指揮者指揮生成物件,返回的是一個完整的物件

參考教程

建造者模式