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

Java 建造者模式完整指南:構建複雜對象的藝術

     編輯:Java 相關知識

為什麼需要建造者模式?

當一個對象包含**多個可選參數**、或**構建過程步驟固定但細節多變**時,構造函數會出現「參數爆炸」(望遠鏡構造函數),且調用者難以記住參數順序。建造者模式將**構建邏輯與表示分離**,支持鏈式調用、分步構建、不可變對象創建,是構建複雜對象的標準解法。

核心角色與 UML

  • Product(產品):最終生成的複雜對象(如 Computer、HttpRequest)。
  • Builder(抽象建造者):定義構建步驟接口(buildCpu()、buildRam()...)。
  • ConcreteBuilder(具體建造者):實現構建邏輯,維護構建過程狀態,最終返回 Product。
  • Director(指揮者):封裝構建算法/步驟順序,隔離客戶端與具體建造細節(可選)。

經典實戰:組裝電腦

1. 產品類

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() { ... }
}

2. 靜態內部類 Builder(推薦寫法,Effective Java 風格)

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

3. 客戶端調用:清晰、不可變、線程安全

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 控制構建流程

當構建步驟有嚴格順序、或需根據不同規則生成不同配置時,引入 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"));

建造者 vs 工廠 vs 原型

模式核心意圖適用場景關鍵特徵
建造者分步構建複雜對象參數多、可選項多、構建順序固定鏈式調用、Director 隔離流程、不可變對象
抽象工廠創建相關/依賴對象族需要切換整個產品族(如換膚、跨平台 UI)多工廠方法、產品族一致性
原型拷貝現有對象創建新對象創建成本高、狀態相似、避免子類爆炸clone()、淺/深拷貝

實戰最佳實踐清單

  1. 必填參數放構造函數,可選參數用鏈式 setter,編譯期強制檢查。
  2. Builder 為靜態內部類,無外部類引用開銷,可訪問 Product 私有構造函數。
  3. 返回 this 實現鏈式,體驗同 DSL。
  4. 構建前驗證:在 build() 中校驗業務規則(如 CPU/主板兼容性),拋出異常而非返回無效對象。
  5. 不可變性:Product 無 setter,所有字段 final,天然線程安全。
  6. Lombok @Builder:簡單場景直接注解生成,注意 @Builder(toBuilder = true) 支持複製修改。

知名庫應用

  • StringBuilder:append() 鏈式構建字符串,最終 toString()。
  • HttpClient Request:HttpRequest.newBuilder().uri().header().POST().build()。
  • MyBatis SqlSessionFactoryBuilder:解析配置、構建會話工廠。
  • Spring BeanDefinitionBuilder:動態構建 Bean 定義。

總結

建造者模式將「如何構建」與「構建什麼」解耦,通過**鏈式 API** 提供極佳的開發體驗,配合**不可變對象**保證運行時安全。掌握「靜態內部類 Builder + 私有構造函數 + 鏈式 setter + build() 驗證」這一標準範式,即可優雅應對一切複雜對象構建場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved