定义
建造者模式是一种创建型设计模式,能够分步骤创建复杂对象。该模式允许使用相同的创建代码生题不同类型和形式的对象。
建造者模式建议将对象构造代码从产品类中抽取出来,并将其放在一个名为生成器的独立对象中。
结构
优点
可以分步创建对象,暂缓创建步骤或递归运行创建步骤
生成不同形式的产品时,你可以复用相同的制造代码
单一职责原则。你可以将复杂构造代码从产品的业务逻辑中分离出来
缺点
由于该模式需要新增多个类,因此代码整体复杂度增加
案例
- #include
- #include
- #include
- using namespace std;
- class Car {
- public:
- Car(){}
- void set_car_tire(string t) {
- tire = t;
- cout << "set tire:" << tire << endl;
- }
- void set_car_steering_wheel(string sw) {
- steering_wheel = sw;
- cout << "set steering wheel:" << steering_wheel << endl;
- }
- void set_car_engine(string e) {
- engine = e;
- cout << "set engine:" << engine << endl;
- }
- private:
- string tire;//轮胎
- string steering_wheel;//方向盘
- string engine;//发动机
- };
-
- //抽象建造者
- class CarBuilder {
- public:
- Car getCar() {
- return car;
- }
- virtual void buildTire() = 0;
- virtual void buildSteeringWheel() = 0;
- virtual void buildEngine() = 0;
- protected:
- Car car;
- };
- //具体建造者 奔驰
- class BenzBuilder :public CarBuilder {
- public:
- //具体实现方法
- virtual void buildTire() {
- car.set_car_tire("benz_tire");
- }
- virtual void buildSteeringWheel() {
- car.set_car_steering_wheel("benz_steering_wheel");
- }
- virtual void buildEngine() {
- car.set_car_engine("benz_engine");
- }
- };
- //具体建造者 奔驰
- class AudiBuilder :public CarBuilder {
- public:
- //具体实现方法
- virtual void buildTire() {
- car.set_car_tire("audi_tire");
- }
- virtual void buildSteeringWheel() {
- car.set_car_steering_wheel("audi_steering_wheel");
- }
- virtual void buildEngine() {
- car.set_car_engine("audi_engine");
- }
- };
- //指挥者
- class Director {
- public:
- Director() : builder(nullptr) {
-
- }
- void set_builder(CarBuilder* cb) {
- builder = cb;
- }
- //组装汽车
- Car constructcar() {
- builder->buildTire();
- builder->buildSteeringWheel();
- builder->buildEngine();
- return builder->getCar();
- }
- private:
- CarBuilder* builder;
- };
- int main()
- {
- CarBuilder* builder;
- Director* director = new Director();
- Car car;
-
- builder = new BenzBuilder();
- director->set_builder(builder);
- car = director->constructcar();
- delete builder;
-
- builder = new AudiBuilder();
- director->set_builder(builder);
- car = director->constructcar();
- delete builder;
-
- delete director;
- return 0;
- }