这是个人学习编程模式的系列学习笔记第十篇。
采用Qt Creator进行编写,但尽量采用C++基础语法。
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
个人理解,建造者模式的思路同前面学习的模板方法模式(Template Method Pattern)思路类似。主体框架固定,具体实现不同,最后的结果不同。不过模板方法侧重于一个过程的执行,建造者模式侧重于大型对象的不同表示。
如果一个大型对象具有多个组成部分,但每个组成部分的构建不同,可以设计一个构建接口类,然后派生具体的构建类。再定义一个构建指挥者类,根据用户需求,调用对应的具体构建类,最后返回创建好的产品。
建造者模式同抽象工厂模式非常类似,都是通过一个统一的类创建不同的产品。区别主要是抽象工厂侧重于一次性创建不同种类的产品,建造者模式侧重于通过逐步构建,创建复杂的对象,有点像流水生产线组装,最后创建一个复杂产品。
场景描述
假设有一个高科技的汽车流水线工厂,可以根据用户的订单安排生产。用户指定车型,流水线马上开工,最后出厂的就是用户需要的车型。
这个流水线同别的流水线不同的是,别的流水线是生产同样的产品,这个流水线生产不同的产品。
设计思路
定义一个汽车生产调度类作为指挥者,定义一条汽车生产流水线作为构建接口类,这个接口类派生出各种具体型号的汽车每个环节的具体生产流程,按照这个生产流程,最终装配出来指定型号的汽车。
UML
代码
#include <iostream>
using namespace std;
class CarLine
{
public:
virtual void assembleBody() = 0;
virtual void assembleWheels() = 0;
virtual void assembleEngine() = 0;
};
class CarModel1 : public CarLine
{
public:
void assembleBody() {cout<<"a red body\n";}
void assembleWheels() {cout<<"four road tires\n";}
void assembleEngine() {cout<<"a 1.6L engine\n";}
};
class CarModel2 : public CarLine
{
public:
void assembleBody() {cout<<"a black body\n";}
void assembleWheels() {cout<<"four offroad tires\n";}
void assembleEngine() {cout<<"a 3.0L engine\n";}
};
class Director
{
private:
CarLine* m_car = 0;
public:
Director(CarLine* car):m_car(car) {}
~Director() {delete m_car;}
void creatCar()
{
m_car->assembleBody();
m_car->assembleWheels();
m_car->assembleEngine();
cout<<"A new car producted!\n";
}
};
int main()
{
Director* order = new Director(new CarModel1());
order->creatCar();
delete order;
order = new Director(new CarModel2());
order->creatCar();
delete order;
return 0;
}