將複雜對象的建構與其表示分離,使相同建構過程可創建不同表示。適用於:參數多、可選參數多、需不可變對象、建構邏輯複雜 (驗證、預設值)。
public class Race {
private final String name;
private final String skinColor;
private final String sex;
private Race(Builder builder) {
this.name = builder.name;
this.skinColor = builder.skinColor;
this.sex = builder.sex;
}
public static class Builder {
private String name;
private String skinColor;
private String sex;
public Builder name(String name) { this.name = name; return this; }
public Builder skinColor(String skinColor) { this.skinColor = skinColor; return this; }
public Builder sex(String sex) { this.sex = sex; return this; }
public Race build() {
// 驗證邏輯
if (name == null || name.isEmpty()) throw new IllegalStateException("名稱必填");
if (skinColor == null) skinColor = "黃色"; // 預設值
if (sex == null) sex = "男";
return new Race(this);
}
}
// Getter...
public String getName() { return name; }
// ...
}
// 客戶端
Race race = new Race.Builder()
.name("張三")
.sex("男")
.skinColor("白色")
.build();
| 要點 | 說明 |
|---|---|
| 不可變性 | 產品類 `final` 欄位、無 setter、Builder `build()` 才創建實例 |
| 鏈式調用 | Setter 返回 `this` (Builder),支援流暢 API |
| 驗證集中 | `build()` 內統一檢查必填、範圍、邏輯一致性 |
| 預設值 | Builder 欄位可預設,`build()` 兜底 |
| 多 Builder | 不同場景可提供 `Race.Builder`、`Race.AdminBuilder` 等 |
public class HttpRequest {
private final String method, url, body;
private final Map headers;
private HttpRequest(Stage3 builder) { ... }
// 階段 1: 必須設定 method
public static class Stage1 { public Stage2 method(String m) { return new Stage2(m); } }
// 階段 2: 必須設定 url
public static class Stage2 { private final String method; public Stage3 url(String u) { return new Stage3(method, u); } }
// 階段 3: 可選 headers/body
public static class Stage3 { ... public HttpRequest build() { ... } }
}
// 強制順序調用
HttpRequest req = new HttpRequest.Stage1().method("POST").url("/api").build();
@Builder
@Value // 不可變
public class Race {
String name;
@Builder.Default String skinColor = "黃色";
@Builder.Default String sex = "男";
}
編譯期生成完整 Builder,支援 `@Builder.Default`、 `@Singular` (集合添加)、`@Builder.ObtainVia` (工廠方法)。
| 維度 | 工廠模式 | 建造者模式 |
|---|---|---|
| 關注點 | 「創建什麼」 (類型決策) | 「如何創建」 (構造細節) |
| 參數複雜度 | 少、固定 | 多、可選、有序 |
| 不可變對象 | 難支持 | 原生支持 |
| 驗證邏輯 | 分散在工廠方法 | 集中在 build() |