以下是一个完整的C++建造者模式示例,包含产品类、建造者接口、具体建造者、指挥者以及测试代码:
#include <iostream>
#include <string>
#include <memory>
// 产品类:汽车
class Car {
public:
void setBody(const std::string& body) { m_body = body; }
void setEngine(const std::string& engine) { m_engine = engine; }
void setWheels(int wheels) { m_wheels = wheels; }
void setElectronics(const std::string& electronics) { m_electronics = electronics; }
void show() const {
std::cout << "Car Details:\n"
<< "Body: " << m_body << "\n"
<< "Engine: " << m_engine << "\n"
<< "Wheels: " << m_wheels << "\n"
<< "Electronics: " << m_electronics << "\n\n";
}
private:
std::string m_body;
std::string m_engine;
int m_wheels = 0;
std::string m_electronics;
};
// 抽象建造者
class CarBuilder {
public:
virtual ~CarBuilder() = default;
virtual void buildBody() = 0;
virtual void buildEngine() = 0;
virtual void buildWheels() = 0;
virtual void buildElectronics() = 0;
virtual Car getResult() = 0;
};
// 具体建造者:运动型汽车
class SportsCarBuilder : public CarBuilder {
public:
void buildBody() override { m_car.setBody("Carbon Fiber Body"); }
void buildEngine() override { m_car.setEngine("V8 Twin Turbo"); }
void buildWheels() override { m_car.setWheels(4); }
void buildElectronics() override { m_car.setElectronics("Racing Package"); }
Car getResult() override { return std::move(m_car); }
private:
Car m_car;
};
// 具体建造者:家用汽车
class FamilyCarBuilder : public CarBuilder {
public:
void buildBody() override { m_car.setBody("Steel Body"); }
void buildEngine() override { m_car.setEngine("1.6L Inline-4"); }
void buildWheels() override { m_car.setWheels(4); }
void buildElectronics() override { m_car.setElectronics("Basic Package"); }
Car getResult() override { return std::move(m_car); }
private:
Car m_car;
};
// 指挥者
class Director {
public:
void setBuilder(CarBuilder* builder) { m_builder = builder; }
void constructCar() {
m_builder->buildBody();
m_builder->buildEngine();
m_builder->buildWheels();
m_builder->buildElectronics();
}
private:
CarBuilder* m_builder;
};
// 测试代码
int main() {
Director director;
// 建造运动型汽车
SportsCarBuilder sportsBuilder;
director.setBuilder(&sportsBuilder);
director.constructCar();
Car sportsCar = sportsBuilder.getResult();
sportsCar.show();
// 建造家用汽车
FamilyCarBuilder familyBuilder;
director.setBuilder(&familyBuilder);
director.constructCar();
Car familyCar = familyBuilder.getResult();
familyCar.show();
return 0;
}
输出结果:
Car Details:
Body: Carbon Fiber Body
Engine: V8 Twin Turbo
Wheels: 4
Electronics: Racing Package
Car Details:
Body: Steel Body
Engine: 1.6L Inline-4
Wheels: 4
Electronics: Basic Package
代码结构说明:
Car类:最终要构建的复杂对象,包含车身、发动机、轮子等组件
CarBuilder抽象类:
- 定义构建汽车各个组件的接口
- 包含4个纯虚函数用于构建不同部件
- 提供获取最终产品的接口
具体建造者:
- SportsCarBuilder:实现运动型汽车的建造细节
- FamilyCarBuilder:实现家用汽车的建造细节
- 每个具体建造者维护自己的Car实例
Director类:
- 控制建造流程
- 定义建造顺序(先车身→发动机→轮子→电子设备)
- 通过组合不同的建造者来创建不同产品
测试代码:
- 演示如何使用建造者模式创建不同类型的产品
- 通过切换建造者来改变最终产品
- 保持创建过程的一致性