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

C++ 設計模式:建造者模式深度解析——復雜對象的分步構建

     編輯:關於C++

模式定義

建造者模式:將復雜對象的構建與其表示分離,使相同構建過程可創建不同表示。屬於創建型模式。

核心痛點:構造函數的侷限

構造窗口控件需:UI初始化、動畫初始化、信號槽初始化。
問題:

  1. 構造函數中調用虛函數失效(vtable 未就緒)。
  2. 子類覆寫初始化邏輯需修改父類構造函數(違反開閉原則)。
  3. 客戶端被迫調用 init()(違反接口隔離)。

建造者模式四大角色

  • Product:最終產品(如 CenterWidget),只有 setter,無構建邏輯。
  • Builder:抽象建造者,聲明構建步驟 buildUI()、buildAnimation()、buildSlots()、getResult()。
  • ConcreteBuilder:具體建造者,實現具體構建細節,持有 Product 實例。
  • Director:指揮者,控制構建順序,調用 Builder 步驟方法。

代碼實現

// Product
class CenterWidget {
    string ui, animation, slots;
public:
    void setUI(string u) { ui = u; }
    void setAnimation(string a) { animation = a; }
    void setSlots(string s) { slots = s; }
    void show() { cout << "UI=" << ui << " Anim=" << animation << " Slots=" << slots << endl; }
};

// Builder
class CenterWidgetBuilder {
public:
    virtual ~CenterWidgetBuilder() {}
    virtual void buildUI() = 0;
    virtual void buildAnimation() = 0;
    virtual void buildSlots() = 0;
    virtual CenterWidget* getResult() = 0;
};

// ConcreteBuilder A
class ConcreteBuilderA : public CenterWidgetBuilder {
    CenterWidget* widget;
public:
    ConcreteBuilderA() : widget(new CenterWidget()) {}
    ~ConcreteBuilderA() { delete widget; }
    void buildUI() override { widget->setUI("Qt UI"); }
    void buildAnimation() override { widget->setAnimation("Biu~Biu~"); }
    void buildSlots() override { widget->setSlots("connected"); }
    CenterWidget* getResult() override { return widget; }
};

// ConcreteBuilder B(繼承 A 復用代碼,只改動畫)
class ConcreteBuilderB : public ConcreteBuilderA {
public:
    void buildAnimation() override { widget->setAnimation("Boom~Boom~"); }
};

// Director
class Director {
    CenterWidgetBuilder* builder;
public:
    Director(CenterWidgetBuilder* b) : builder(b) {}
    ~Director() { delete builder; }
    void construct() {
        builder->buildUI();
        builder->buildAnimation();
        builder->buildSlots();
    }
};

// 客戶端
int main() {
    Director* d1 = new Director(new ConcreteBuilderA());
    d1->construct();
    d1->getResult()->show(); // Biu~Biu~
    
    Director* d2 = new Director(new ConcreteBuilderB());
    d2->construct();
    d2->getResult()->show(); // Boom~Boom~
}

建造者 vs 工廠模式

維度建造者模式工廠模式
關注點構建過程(多步驟、有順序)創建結果(單步、無順序)
產品複雜度復雜,多部件相對簡單
客戶端參與通過 Director 控制過程直接調用工廠方法
典型場景文檔轉換、複雜對象組裝、SQL 構建器對象池、插件加載、單例訪問

優缺點

  • 優點:構建與表示分離、精細控制構建步驟、易於增加新 Builder、符合單一職責。
  • 缺點:產品組成相似時適用;內部變化大導致 Builder 類膨脹;Director 增加間接層。

適用場景

  1. 產品由多個部件組成,構建步驟固定但細節可變。
  2. 構建順序有依賴關係(如先 UI 後動畫)。
  3. 需要生成不同表示的產品(如不同主題的窗口)。

現代變體:鏈式調用 / Fluent Builder

class WidgetBuilder {
    CenterWidget widget;
public:
    WidgetBuilder& setUI(string u) { widget.setUI(u); return *this; }
    WidgetBuilder& setAnim(string a) { widget.setAnimation(a); return *this; }
    WidgetBuilder& setSlots(string s) { widget.setSlots(s); return *this; }
    CenterWidget build() { return std::move(widget); }
};

// 使用
CenterWidget w = WidgetBuilder().setUI("Qt").setAnim("Biu").setSlots("conn").build();

總結

建造者模式將「如何構建」從「構建什麼」中分離。核心:Builder 定義步驟,ConcreteBuilder 實現細節,Director 控制流程,Product 只負責數據持有。現代 C++ 常用鏈式 Fluent Builder 替代傳統四角色,更簡潔。理解本質:分步構建 + 過程與表示分離。

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