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

建造者模式完整指南:從核心角色到與工廠模式的關係辨析

     編輯:Java 綜合教學

模式定義

建造者模式將**複雜物件的建構過程**與其**表示**分離,使相同建構過程可創建不同表示。核心思想:**分步驟建構、導演者協調、建造者實作細節**。

四大核心角色

建造者模式 UML

代碼實戰:汽車製造

// 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]
    }
}

適用場景

  1. 產品內部結構複雜 (多部件、巢狀物件)
  2. 部件間有依賴順序 (須分步驟建構)
  3. 建構過程需對外隱藏細節
  4. 相同建構流程產出不同表示 (如不同品牌車、不同格式文檔)

優勢總結

  • 封裝性佳:建構細節封裝在 Builder,Director 僅知順序
  • 擴展性強:新增產品只需新增 ConcreteBuilder,符合開閉原則
  • 精細控制:可逐步驗證、記錄、回滾建構步驟
  • 單一職責:導演者管流程、建造者管細節、產品管資料

建造者 vs 工廠模式:關鍵差異

角色職責典型形式
Director (導演者)協調建構順序,調用建造者介面組裝產品具體類,含建構邏輯
Builder (抽象建造者)定義建構步驟介面 (建造部件、返回產品)介面/抽象類
ConcreteBuilder (具體建造者)實作具體建構細節,維護產品實例具體類
Product (產品)複雜物件,含多個部件具體類
維度建造者模式工廠模式 (簡單/抽象)
核心關注**建構過程** (步驟、順序、細節)**創建結果** (一次性返回完整物件)
適用複雜度高 (多部件、依賴順序)低/中 (單一物件或同族物件)
客戶端參與度低 (只呼叫 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 設計。

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