这篇文章介绍设计模式中 "创建型模式"的第三种 —— 创建者(Builder)模式。
创建者模式将复杂对象的构造和表示相分离,同样的构建过程可以创建不同的表示。
其强调创建产品的过程是有步骤的,有时候甚至可以强制指定构建次序。
其中产品的不同表现形式是通过扩展 构造器 实现的。
下面以汽车产品为例进行说明,比如汽车包括:汽车厂商 汽车引擎 汽车底盘 汽车轮胎。
一个汽车厂商生产的汽车,各部件可以采用不同公司生产的,只需对其进行组合即可。
因此定义一个抽象创建者类,该类提供了上述各个部件的实现接口。
对于不同的factory,生成一个相应的创建者Builder(继承自抽象创建者类),实现抽象类中的相应方法即可。
代码如下:
#include <iostream>
#include <string>
#include <memory>
using namespace std;
// 产品(包括多个部件)
class CCar
{
public:
void setManufactory(const string& manufactory)
{
m_strManufactory = manufactory;
}
const string& getManufactory()
{
return m_strManufactory;
}
// 部件1
void setEngine(const string& engine)
{
m_strEngine = engine;
}
const string& getEngine()
{
return m_strEngine;
}
// 部件2
void setUnderPan(const string& underPan)
{
m_strUnderPan = underPan;
}
const string& getUnderPan()
{
return m_strUnderPan;
}
// 部件3
void setWheel(const string& wheel)
{
m_strWheel = wheel;
}
const string& getWheel()
{
return m_strWheel;
}
void printInfo()
{
cout << m_strManufactory << " " << m_strEngine <<
" " << m_strUnderPan << " " << m_strWheel << endl;
}
private:
string m_strManufactory;
string m_strEngine;
string m_strUnderPan;
string m_strWheel;
};
// Abstract Builder
class CCarBuildBase
{
public:
// 不变的部分作为公开接口函数 这里的接口需要稳定
CCar* build()
{
buildManufactory();
buildEngine();
buildUnderPan();
buildWheel();
return &m_car;
}
protected:
// 可变的部分由子类实现
// 复杂Car对象由以下几个模块组成
virtual void buildManufactory() = 0;
virtual void buildEngine() = 0;
virtual void buildUnderPan() = 0;
virtual void buildWheel() = 0;
CCar m_car;
};
// 第一个concrete builder
class GMCarBuilder :public CCarBuildBase
{
protected:
void buildManufactory()
{
m_car.setManufactory("GM");
}
void buildEngine()
{
m_car.setEngine("劳斯莱斯引擎");
}
void buildUnderPan()
{
m_car.setUnderPan("GM底盘");
}
void buildWheel()
{
m_car.setWheel("Miklon轮胎");
}
};
// 第二个concrete builder
class FordCarBuilder :public CCarBuildBase
{
protected:
void buildManufactory()
{
m_car.setManufactory("Ford");
}
void buildEngine()
{
m_car.setEngine("劳斯莱斯引擎");
}
void buildUnderPan()
{
m_car.setUnderPan("Benz底盘");
}
void buildWheel()
{
m_car.setWheel("PulySitong轮胎");
}
};
// 创建产品(CCar)的指导类
class CCarDirector
{
public:
CCar* buildCar(CCarBuildBase* pBuilder)
{
return pBuilder->build();
}
};
// 测试函数
void testBuilder()
{
CCarDirector director;
GMCarBuilder gmBuilder;
FordCarBuilder fordBuilder;
CCar* pCar = director.buildCar(&gmBuilder);
pCar->printInfo();
pCar = director.buildCar(&fordBuilder);
pCar->printInfo();
delete pCar;
pCar = NULL;
}
int main(void)
{
testBuilder();
return 0;
}