| 角色 | 職責 | 典型形式 |
| Director (導演者) | 協調建構順序,調用建造者介面組裝產品 | 具體類,含建構邏輯 |
| Builder (抽象建造者) | 定義建構步驟介面 (建造部件、返回產品) | 介面/抽象類 |
| ConcreteBuilder (具體建造者) | 實作具體建構細節,維護產品實例 | 具體類 |
| Product (產品) | 複雜物件,含多個部件 | 具體類 |

代碼實戰:汽車製造
// Product
class Car {
private String engine, wheels, color;
public void setEngine(String e) { engine = e; }
public void setWheels(String w) { wheels = w; }
public void setColor(String c) { color = c; }
@Override public String toString() { return "Car[engine=" + engine + ", wheels=" + wheels + ", color=" + color + "]"; }
}
// Builder
abstract class CarBuilder {
protected Car car = new Car();
public abstract void buildEngine();
public abstract void buildWheels();
public abstract void buildColor();
public Car getCar() { return car; }
}
// ConcreteBuilder
class BMWBuilder extends CarBuilder {
public void buildEngine() { car.setEngine("V8"); }
public void buildWheels() { car.setWheels("19 inch"); }
public void buildColor() { car.setColor("Black"); }
}
class AudiBuilder extends CarBuilder {
public void buildEngine() { car.setEngine("V6"); }
public void buildWheels() { car.setWheels("18 inch"); }
public void buildColor() { car.setColor("White"); }
}
// Director
class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder b) { this.builder = b; }
public Car construct() {
builder.buildEngine();
builder.buildWheels();
builder.buildColor();
return builder.getCar();
}
}
// Client
public class Demo {
public static void main(String[] args) {
CarDirector director = new CarDirector(new BMWBuilder());
Car bmw = director.construct();
System.out.println(bmw); // Car[engine=V8, wheels=19 inch, color=Black]
}
}
適用場景
- 產品內部結構複雜 (多部件、巢狀物件)
- 部件間有依賴順序 (須分步驟建構)
- 建構過程需對外隱藏細節
- 相同建構流程產出不同表示 (如不同品牌車、不同格式文檔)
優勢總結
- 封裝性佳:建構細節封裝在 Builder,Director 僅知順序
- 擴展性強:新增產品只需新增 ConcreteBuilder,符合開閉原則
- 精細控制:可逐步驗證、記錄、回滾建構步驟
- 單一職責:導演者管流程、建造者管細節、產品管資料
建造者 vs 工廠模式:關鍵差異
| 維度 | 建造者模式 | 工廠模式 (簡單/抽象) |
| 核心關注 | **建構過程** (步驟、順序、細節) | **創建結果** (一次性返回完整物件) |
| 適用複雜度 | 高 (多部件、依賴順序) | 低/中 (單一物件或同族物件) |
| 客戶端參與度 | 低 (只呼叫 Director) | 中 (選擇具體工廠/參數) |
| 不可變物件支援 | 極佳 (可配合 Builder 模式鏈式調用) | 一般 |
| 典型場景 | StringBuilder、HttpClient.Builder、Lombok @Builder | 集合工廠、JDBC DriverManager |
現代變體:鏈式 Builder (Lombok @Builder 風格)
public class User {
private final String name;
private final int age;
private final String email;
private User(Builder b) {
this.name = b.name; this.age = b.age; this.email = b.email;
}
public static class Builder {
private String name; private int age; private String email;
public Builder name(String n) { name = n; return this; }
public Builder age(int a) { age = a; return this; }
public Builder email(String e) { email = e; return this; }
public User build() { return new User(this); }
}
}
// 使用
User u = new User.Builder().name("Alex").age(25).email("a@b.com").build();
此變體無 Director,Builder 直接暴露鏈式 API,更適合現代流式 API 設計。
- 上一篇文章: Java hashCode() 與 equals() 契約深度解析:Hash 集合正確性的基石
- 下一篇文章: Mac 上 Maven 入門完整教學:安裝、環境變數配置與首個專案建立
Copyright ©
程式碼之家 All Rights Reserved