建造者模式又称生成者模式,该模式是一种创建型设计模式,能够分步骤创建复杂对象。
该模式允许使用相同的创建代码通过不同的创建过程生成不同类型的对象。
建造者模式(Builder)所构建的对象一定是庞大而复杂的,并且一定是按照既定的制造工序将组件组装起来的,例如计算机、汽车、建筑物等。我们通常将负责构建这些大型对象的工程师称为建造者。建造者模式又称为生成器模式,主要用于对复杂对象的构建、初始化,它可以将多个简单的组件对象按顺序一步步组装起来,最终构建成一个复杂的成品对象。
建造者模式将一个复杂对象的创建过程封装起来;允许对象通过多个步骤来创建,而且可以改变创建过程(这和只有一个步骤的工厂模式不同)。
工厂模式:创建不同但是相关类型的对象(继承同一父类或接口的一组子类),由给定的参数决定创建哪种类型的对象。
建造者模式:创建一种类型的复杂对象,通过设置不同的参数,"定制化"地创建不同的对象。
案例:
比如我们现在已经用程序实现了一个汽车使用的全过程:启动,发动引擎,鸣笛,停车。但是不同的人使用汽车的习惯可能不同,比如张三习惯启动后先按一下喇叭,而李四习惯先按下喇叭在启动,这就导致上面的程序不能同时满足两人的要求。所以,我们这里要实现可以让客户自己定义执行顺序的需求。
我们来整理一下思路,首先,不管客户的需求是什么样子的,汽车的功能是不会变的,永远都有启动、发动引擎、鸣笛和停车的功能,所以,我们可以把这些共有的行为抽象到父类定义,具体怎么实现交给子类去实现即可。然后,由于张三和李四想要按不同的顺序执行汽车的四个方法,我们通过一个方法设置汽车启动的步骤就可以了。
注意:真正实现中使用汽车的每一个步骤都涉及到创建多个复杂的类,这里简化成一个方法的调用;
类图:
实现如下:
car.h:
#ifndef CAR_H
#define CAR_H
#include <iostream>
using namespace std;
class Car {
public:
virtual void start() = 0;
virtual void engineBoom() = 0;
virtual void alarm() = 0;
virtual void stop() = 0;
};
class ACar : public Car {
public:
virtual void start() override
{
cout << "A类车启动" << endl;
}
virtual void engineBoom() override
{
cout << "A类车发动引擎" << endl;
}
virtual void alarm() override
{
cout << "A类车鸣笛" << endl;
}
virtual void stop() override
{
cout << "A类车停车" << endl;
}
};
class BCar : public Car {
public:
virtual void start() override
{
cout << "B类车启动" << endl;
}
virtual void engineBoom() override
{
cout << "B类车发动引擎" << endl;
}
virtual void alarm() override
{
cout << "B类车鸣笛" << endl;
}
virtual void stop() override
{
cout << "B类车停车" << endl;
}
};
#endif // CAR_H
builder.h:
#ifndef BUILDER_H
#define BUILDER_H
#include "car.h"
class Builder {
public:
virtual void setSequence() = 0;
protected:
Car* m_car;
};
class ACarBuilder : public Builder {
public:
ACarBuilder()
{
m_car = new ACar();
}
virtual void setSequence() override
{
m_car->start();
m_car->engineBoom();
m_car->alarm();
m_car->stop();
}
};
class BCarBuilder : public Builder {
public:
BCarBuilder()
{
m_car = new BCar();
}
virtual void setSequence() override
{
m_car->start();
m_car->alarm();
m_car->engineBoom();
m_car->stop();
}
};
#endif // BUILDER_H
main.cpp:
/*
* 建造者模式
*
* date:2023-9-18
*/
#include "builder.h"
int main()
{
Builder* builder = new ACarBuilder();
builder->setSequence();
cout << endl;
builder = new BCarBuilder();
builder->setSequence();
}
运行截图: