什麼是建造者模式
玩過橡皮泥沒?玩過樂高積木沒?橡皮泥、樂高積木,這兩個東西就能充分體現建造者模式的含義。
相同的材料,不同的組裝思路,能夠得到花樣的產品模型,這就是建造者模式最核心的思想。
建造者模式跟工廠模式很像,因爲都是生產對象的模式,所以容易混淆在一起。它們的區別在於:
- 工廠模式側重於用不同材料生產不同產品,關注材料多樣性,不關注組裝靈活性
- 建造者模式側重於用相同材料組裝成不同產品,關注組裝靈活性,不關注材料多樣性
模式設計與實現
通常情況下,使用建造者模式,會有三類角色概念:
- 產品類:這是最根本的角色,必須要有的,並且,產品在設計上應該具有可拆分、可組裝的特性
- 建造者:可以根據規範說明,把零部件組裝成產品的角色,就像是玩積木的小孩子
- 指揮者:掌握着產品設計需求,可以指揮建造者行動的角色,就像是引導孩子用樂高積木搭建出各種模型的家長
理清角色關係,掌握模式的核心要點以後,代碼實現也有多種多樣的選擇。
因爲產品是可拆分的,所以,很容易想到,在代碼層面,類與類之間使用組合關係會更好。
代碼實現大概是這個樣子的吧:
// 產品類:爲了少寫點代碼,屬性定義爲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
類的設計看着和簡單工廠模式很像吧?其實它倆只是代碼寫的像,邏輯含義是有區別的,主要體現在方法參數上:
- 簡單工廠的參數含義是“哪一種類型的產品”
- 建造者方法的參數含義是“產品的成分是什麼”
如果拿樂高舉例,到目前爲止,我們的指揮者Director
可以搭建兩種樂高模型。
如果要搭建更多不同樣式的樂高模型,只需要在指揮者Director
裏面繼續添加搭建方法,給出具體的模型搭建方案即可,產品類和建造者都不需要改動。