首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 建造者模式:鏈式調用構建複雜對象、不可變對象、驗證邏輯

     編輯:Java 程式設計入門

模式定義

將複雜對象的建構與其表示分離,使相同建構過程可創建不同表示。適用於:參數多、可選參數多、需不可變對象、建構邏輯複雜 (驗證、預設值)。

經典實現:鏈式 Builder

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` 等

進階:階段式 Builder (強制順序)

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();

Lombok `@Builder` 自動生成

@Builder
@Value // 不可變
public class Race {
    String name;
    @Builder.Default String skinColor = "黃色";
    @Builder.Default String sex = "男";
}

編譯期生成完整 Builder,支援 `@Builder.Default`、 `@Singular` (集合添加)、`@Builder.ObtainVia` (工廠方法)。

對比:工廠模式 vs 建造者模式

維度工廠模式建造者模式
關注點「創建什麼」 (類型決策)「如何創建」 (構造細節)
參數複雜度少、固定多、可選、有序
不可變對象難支持原生支持
驗證邏輯分散在工廠方法集中在 build()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved