构造器设计模式
功能和作用
构造器模式用于分离复杂对象的构造与表示。它允许用户通过相同的构造过程创建不同的对象表示,特别适用于需要多个步骤才能完成的对象创建场景。
原理
- 抽象与实现分离:将对象的构建步骤抽象到接口中
- 分步构造:允许逐步添加对象的组成部分
- 最终组装 :通过
build()方法返回完整对象
使用场景
- 需要创建复杂对象(含多个组成部分)
- 构造过程需要不同的实现
- 需要分离对象的构造算法与表示
- 需要控制对象的创建步骤
为什么这样设计
- 封装变化:将构造过程的变化封装在具体构造器中
- 开放封闭:新增产品类型只需扩展新构造器
- 单一职责:导向器负责构造流程,构造器负责具体实现
优缺点
优点:
- 构造过程与表示分离
- 精细控制构造流程
- 符合开闭原则
- 代码可读性高
缺点:
- 增加系统复杂度
- 需要创建多个具体构造器类
- 产品需为公共接口
使用方式
Director +construct(Builder) <<interface>> Builder +buildPartA() +buildPartB() +getResult() ConcreteBuilder -product: Product +buildPartA() +buildPartB() +getResult() Product +components
时序图
Client Director ConcreteBuilder Product 创建具体构造器 设置构造器 buildPartA() buildPartB() getResult() 返回完整产品 Client Director ConcreteBuilder Product
C++ 实现
cpp
#include <iostream>
#include <string>
#include <vector>
// 产品类
class Pizza {
public:
void addTopping(const std::string& topping) {
toppings_.push_back(topping);
}
void showPizza() {
std::cout << "Pizza with toppings: ";
for (const auto& top : toppings_) {
std::cout << top << " ";
}
std::cout << std::endl;
}
private:
std::vector<std::string> toppings_;
};
// 抽象构造器
class PizzaBuilder {
public:
virtual void buildDough() = 0;
virtual void buildSauce() = 0;
virtual void buildToppings() = 0;
virtual Pizza* getPizza() = 0;
virtual ~PizzaBuilder() {}
};
// 具体构造器
class HawaiianPizzaBuilder : public PizzaBuilder {
public:
HawaiianPizzaBuilder() { pizza_ = new Pizza(); }
void buildDough() override {
pizza_->addTopping("Thin Crust");
}
void buildSauce() override {
pizza_->addTopping("Tomato Sauce");
}
void buildToppings() override {
pizza_->addTopping("Ham");
pizza_->addTopping("Pineapple");
}
Pizza* getPizza() override {
return pizza_;
}
private:
Pizza* pizza_;
};
// 导向器
class Cook {
public:
void makePizza(PizzaBuilder* builder) {
builder->buildDough();
builder->buildSauce();
builder->buildToppings();
}
};
// 测试代码
int main() {
Cook cook;
HawaiianPizzaBuilder hawaiianBuilder;
cook.makePizza(&hawaiianBuilder);
Pizza* pizza = hawaiianBuilder.getPizza();
pizza->showPizza();
delete pizza;
return 0;
}
---
编译运行和测试输出
编译和运行步骤:
- 保存代码为
builder.cpp。 - 编译:使用g++编译器(例如:
g++ builder.cpp -o build)。 - 运行:
./build。
测试输出:
Pizza with topping:Thin Crust Tomato Sauce Ham Pineapple
总结
构造器模式通过分离对象的构造与表示,提供了灵活的复杂对象创建方案。它特别适用于需要分步构造且构造过程可能变化的场景,虽然增加了系统复杂度,但显著提高了代码的可维护性和扩展性。