建造者模式:將復雜對象的構建與其表示分離,使相同構建過程可創建不同表示。屬於創建型模式。
構造窗口控件需:UI初始化、動畫初始化、信號槽初始化。
問題:
init()(違反接口隔離)。CenterWidget),只有 setter,無構建邏輯。buildUI()、buildAnimation()、buildSlots()、getResult()。// 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~
}
| 維度 | 建造者模式 | 工廠模式 |
|---|---|---|
| 關注點 | 構建過程(多步驟、有順序) | 創建結果(單步、無順序) |
| 產品複雜度 | 復雜,多部件 | 相對簡單 |
| 客戶端參與 | 通過 Director 控制過程 | 直接調用工廠方法 |
| 典型場景 | 文檔轉換、複雜對象組裝、SQL 構建器 | 對象池、插件加載、單例訪問 |
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 替代傳統四角色,更簡潔。理解本質:分步構建 + 過程與表示分離。