建造者模式(Builder Pattern)

街酒發表於2023-05-10

模式動機

建造者模式(Builder Pattern)是最複雜的建立型模式,它用於建立一個包含多個組成部分的複雜物件,可以返回一個完整的產品物件給使用者。它透過將客戶端與包含多個組成部分的複雜物件的建立過程分離,使得客戶端無需知道複雜物件的內部組成部分與裝配方式,只需要知道建造者的型別即可。它關注如何一步一步建立一個複雜物件,不同的具體建造者定義了不同的建立過程,且具體建造者相互獨立,增加新的建造者非常方便,系統具有較好的擴充套件性。

模式定義

  • 建造者模式(Builder Pattern):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
  • 建造者模式是一步一步建立一個複雜的物件,它允許使用者只透過指定複雜物件的型別和內容就可以構建它們,使用者不需要知道內部的具體構建細節。建造者模式屬於物件建立型模式。

模式結構

image

模式分析

產品:一個由多種元件組合生成的複雜物件

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角色扮演指揮者與建造者雙重角色

相關文章