模式定義與核心價值
- 分步驟從簡單對象構建複雜對象
- 僅指定類型與內容即可獲得複雜對象
- 將構建過程與組件解耦、分離構建代碼與表現代碼
- 程序員對構建過程擁有更精細控制
相關模式對比
| 模式 | 關注點 |
| Abstract Factory | 工廠層面,產品族創建 |
| Builder | 基於簡單對象構建單一複雜對象的步驟與順序 |
| Composite | 樹形結構組合複雜對象 |
實戰案例:建房子流程建模
四步驟固定流程
- 打地基
- 建框架
- 建室外
- 建室內
抽象建造者定義步驟介面
abstract class HouseBuilder {
protected House house = new House();
abstract public void buildFoundation();
abstract public void buildFrame();
abstract public void buildExterior();
abstract public void buildInterior();
}
導演者強制執行順序
class WorkShop {
public void construct(HouseBuilder hb) {
hb.buildFoundation();
hb.buildFrame();
hb.buildExterior();
hb.buildInterior();
}
}
具體建造者:平房 vs 兩層樓
class OneStoryHouse extends HouseBuilder {
public void buildFoundation() { house.setProgress("地基完成"); }
public void buildFrame() { house.setProgress("框架完成"); }
public void buildExterior() { house.setProgress("室外完成"); }
public void buildInterior() { house.setProgress("室內施工中"); }
}
class TwoStoryHouse extends HouseBuilder {
public void buildFoundation() { house.setProgress("地基完成"); }
public void buildFrame() { house.setProgress("框架施工中"); }
public void buildExterior() { house.setProgress("室外待開工"); }
public void buildInterior() { house.setProgress("室內未開始"); }
}
產品類別
class House {
private String type;
private List features = new ArrayList();
public void setProgress(String s) { features.add(s); }
public String toString() { /* 格式化輸出 */ }
}
測試驗證
HouseBuilder one = new OneStoryHouse("2房2衛2車位1500呎");
HouseBuilder two = new TwoStoryHouse("4房4衛3車位5000呎");
WorkShop shop = new WorkShop();
shop.construct(one);
shop.construct(two);
System.out.println(one.showProgress());
System.out.println(two.showProgress());
執行結果
OneStoryHouse 2房2衛2車位1500呎
地基完成
框架完成
室外完成
室內施工中
TwoStoryHouse 4房4衛3車位5000呎
地基完成
框架施工中
室外待開工
室內未開始
擴展應用建議
- 每個 `doXXX` 步驟可拆分為獨立類(門、窗、廚房等),實現組件復用
- 披薩製作程序:每種配料設計為類,不同披薩組合不同配料,完美適用 Builder
- 進階優化:引入 fluent interface(鏈式調用)提升 API 易用性