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

建造者模式深度解析:構建複雜對象的藝術

     編輯:Java 相關知識

模式定義與核心價值

建造者模式將複雜對象的構建過程與其表示分離,使相同構建流程能創建不同表示。關鍵在於「分步構建」與「流程控制」。

與抽象工廠模式的關鍵差異

維度建造者模式抽象工廠模式
關注點零件類型、裝配順序、構建步驟產品族、多系列產品創建
產品返回時機最後一步才返回完整產品立即返回產品
核心角色Director(指揮者)控制流程Factory 直接創建

四大核心角色

  1. Builder(抽象建造者):定義構建部件的抽象介面。
  2. ConcreteBuilder(具體建造者):實現部件構建,提供獲取產品方法。
  3. Product(產品):被構建的複雜對象,可無共同介面。
  4. Director(指揮者):安排構建順序,隔離客戶端與構建細節。

代碼完整實現

// 1. 抽象建造者
public interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
}

// 2. 具體建造者 A
public class BuilderImpl implements Builder {
    public void buildPartA() { System.out.println("構建部件 A"); }
    public void buildPartB() { System.out.println("構建部件 B"); }
    public void buildPartC() { System.out.println("構建部件 C"); }
}

// 3. 具體建造者 B(不同實現)
public class BuilderImpl2 implements Builder {
    public void buildPartA() { System.out.println("構建部件 AA"); }
    public void buildPartB() { System.out.println("構建部件 BB"); }
    public void buildPartC() { System.out.println("構建部件 CC"); }
}

// 4. 指揮者:定義構建流程
public class Director {
    private Builder builder;
    public Director(Builder b) { builder = b; }
    public void construct() {
        System.out.println("Director 指揮構建流程 1");
        builder.buildPartA(); builder.buildPartB(); builder.buildPartC();
    }
}

// 5. 另一指揮者:不同構建順序
public class Director2 {
    private Builder builder;
    public Director2(Builder b) { builder = b; }
    public void construct() {
        System.out.println("Director2 指揮構建流程 2");
        builder.buildPartB(); builder.buildPartC(); builder.buildPartA();
    }
}

// 6. 客戶端測試
public class Test {
    public static void main(String[] args) {
        // 流程1 + 實現A
        new Director(new BuilderImpl()).construct();
        System.out.println();
        // 流程1 + 實現B
        new Director(new BuilderImpl2()).construct();
        System.out.println();
        // 流程2 + 實現B
        new Director2(new BuilderImpl2()).construct();
    }
}

輸出結果

Director 指揮構建流程 1
構建部件 A
構建部件 B
構建部件 C

Director 指揮構建流程 1
構建部件 AA
構建部件 BB
構建部件 CC

Director2 指揮構建流程 2
構建部件 BB
構建部件 CC
構建部件 AA

優缺點與適用場景

優點

  • 封裝構建細節,客戶端無需知道內部組裝邏輯。
  • 精確控制構建步驟順序,可強制執行特定流程。
  • 易於新增新的建造者或指揮者,擴展性強。

缺點

每種產品變體需對應一個 ConcreteBuilder,類別數量增加。

適用場景

  • 演算法應獨立於對象組成部分及其裝配方式時。
  • 構建過程需允許被構建對象有不同表示(相同方法、不同順序產生不同結果)。
  • 典型應用:StringBuilder、HTTP 請求構建器、複雜報表生成器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved