當一個對象包含**多個可選參數**、或**構建過程步驟固定但細節多變**時,構造函數會出現「參數爆炸」(望遠鏡構造函數),且調用者難以記住參數順序。建造者模式將**構建邏輯與表示分離**,支持鏈式調用、分步構建、不可變對象創建,是構建複雜對象的標準解法。
Computer、HttpRequest)。buildCpu()、buildRam()...)。public class Computer {
private String cpu; // 必填
private String ram; // 必填
private String storage; // 可選
private String gpu; // 可選
private String os; // 可選
// 私有構造函數,強制通過 Builder 創建
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.storage = builder.storage;
this.gpu = builder.gpu;
this.os = builder.os;
}
// getter 省略
@Override public String toString() { ... }
}
public static class Builder {
// 必填參數
private final String cpu;
private final String ram;
// 可選參數,默認值
private String storage = "256GB SSD";
private String gpu = "Integrated";
private String os = "Windows 10";
public Builder(String cpu, String ram) {
this.cpu = cpu; this.ram = ram;
}
// 鏈式設置可選項
public Builder storage(String val) { this.storage = val; return this; }
public Builder gpu(String val) { this.gpu = val; return this; }
public Builder os(String val) { this.os = val; return this; }
// 構建最終對象
public Computer build() { return new Computer(this); }
}
Computer gamingPC = new Computer.Builder("i9-13900K", "64GB DDR5")
.storage("2TB NVMe")
.gpu("RTX 4090")
.os("Ubuntu 22.04")
.build();
Computer officePC = new Computer.Builder("i5-13400", "16GB DDR4").build(); // 全默認
當構建步驟有嚴格順序、或需根據不同規則生成不同配置時,引入 Director:
public class ComputerDirector {
public Computer buildGamingPC(Computer.Builder builder) {
return builder.storage("1TB NVMe").gpu("RTX 4080").os("Windows 11").build();
}
public Computer buildServer(Computer.Builder builder) {
return builder.storage("4TB RAID").gpu("None").os("Linux Server").build();
}
}
// 使用
ComputerDirector director = new ComputerDirector();
Computer pc = director.buildGamingPC(new Computer.Builder("i7", "32GB"));
| 模式 | 核心意圖 | 適用場景 | 關鍵特徵 |
|---|---|---|---|
| 建造者 | 分步構建複雜對象 | 參數多、可選項多、構建順序固定 | 鏈式調用、Director 隔離流程、不可變對象 |
| 抽象工廠 | 創建相關/依賴對象族 | 需要切換整個產品族(如換膚、跨平台 UI) | 多工廠方法、產品族一致性 |
| 原型 | 拷貝現有對象創建新對象 | 創建成本高、狀態相似、避免子類爆炸 | clone()、淺/深拷貝 |
build() 中校驗業務規則(如 CPU/主板兼容性),拋出異常而非返回無效對象。@Builder(toBuilder = true) 支持複製修改。append() 鏈式構建字符串,最終 toString()。HttpRequest.newBuilder().uri().header().POST().build()。建造者模式將「如何構建」與「構建什麼」解耦,通過**鏈式 API** 提供極佳的開發體驗,配合**不可變對象**保證運行時安全。掌握「靜態內部類 Builder + 私有構造函數 + 鏈式 setter + build() 驗證」這一標準範式,即可優雅應對一切複雜對象構建場景。