[設計模式] 創建型:建造者模式(Builder Pattern)

什麼是建造者模式

玩過橡皮泥沒?玩過樂高積木沒?橡皮泥、樂高積木,這兩個東西就能充分體現建造者模式的含義。

相同的材料,不同的組裝思路,能夠得到花樣的產品模型,這就是建造者模式最核心的思想。

建造者模式跟工廠模式很像,因爲都是生產對象的模式,所以容易混淆在一起。它們的區別在於:

  1. 工廠模式側重於用不同材料生產不同產品,關注材料多樣性,不關注組裝靈活性
  2. 建造者模式側重於用相同材料組裝成不同產品,關注組裝靈活性,不關注材料多樣性

模式設計與實現

通常情況下,使用建造者模式,會有三類角色概念:

  1. 產品類:這是最根本的角色,必須要有的,並且,產品在設計上應該具有可拆分、可組裝的特性
  2. 建造者:可以根據規範說明,把零部件組裝成產品的角色,就像是玩積木的小孩子
  3. 指揮者:掌握着產品設計需求,可以指揮建造者行動的角色,就像是引導孩子用樂高積木搭建出各種模型的家長

理清角色關係,掌握模式的核心要點以後,代碼實現也有多種多樣的選擇。

因爲產品是可拆分的,所以,很容易想到,在代碼層面,類與類之間使用組合關係會更好。

代碼實現大概是這個樣子的吧:

// 產品類:爲了少寫點代碼,屬性定義爲public
public class Product {
    public String partA;
    public String partB;
    public String partC;
}

// 建造者
public class Builder {
    // 根據需求規範建造產品
    public Product buildProduct(String partA, String partB, String partC) {
        Product product = new Product();
        product.partA = partA;
        product.partB = partB;
        product.partC = partC;
        return product;
    }
}

// 指揮者
public class Director {
    private Builder builder;
    public Director(Builder builder) { this.builder = builder; }
    // 產品模型1
    public Product getProduct1() {
        String partA = "1個紅色的樂高積木";
        String partB = "2個黃色的樂高積木";
        String partC = "3個藍色的樂高積木";
        return builder.buildProduct(partA, partB, partC);
    }
    // 產品模型2
    public Product getProduct2() {
        String partA = "10個白色的樂高積木";
        String partB = "20個黑色的樂高積木";
        String partC = "30個藍色的樂高積木";
        return builder.buildProduct(partA, partB, partC);
    }
}

這段代碼只是展示出建造者模式的基本概念和實現思路,實際使用當中,通常還會融入其它的設計模式,例如工廠方法、抽象模版方法等。

Builder類的設計看着和簡單工廠模式很像吧?其實它倆只是代碼寫的像,邏輯含義是有區別的,主要體現在方法參數上:

  1. 簡單工廠的參數含義是“哪一種類型的產品”
  2. 建造者方法的參數含義是“產品的成分是什麼”

如果拿樂高舉例,到目前爲止,我們的指揮者Director可以搭建兩種樂高模型。

如果要搭建更多不同樣式的樂高模型,只需要在指揮者Director裏面繼續添加搭建方法,給出具體的模型搭建方案即可,產品類和建造者都不需要改動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章