#include "stdafx.h"
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <string>
#include <vector>
using namespace boost;
#define CC_SYNTHESIZE_PRIVATE(varType, varName, funName)\
private: varType varName;\
public: virtual varType get##funName(void) const { return varName; }\
public: virtual void set##funName(varType var){ varName = var; }
//创建者模式实现了复杂对象的创建和表示相分离
//表示就是指具体的产品对象
//创建就是具体的创建过程
//创建者模式强调的是过程,工厂模式强调的是结果
//创建者模式强调产品的创建过程是有一定的先后顺序的,
//创建者模式可以实现使用相同的创建过程创建出不同的产品(表示)
//下面以创建汽车对象为例进行讲解
//汽车是一个复杂的产品,比如它是由底盘,引擎,轮子,和不同的厂家(例如宝马,奔驰等厂家公司创建其他汽车部件)
//这些部件的底盘,引擎,轮子的品牌也各部相同
//正因为这些不同才可以相同的创建过程可以创建出不同的表示
//这里用string模拟表示车子的部件
typedef std::string Manufatory; //厂家自己构建的车子部件
typedef std::string Engine; //不同型号的引擎部件
typedef std::string UnderPan; //底盘
typedef std::string Wheel; //车轮
//用户需要的车产品
class Car
{
public:
Car()
{
__m_Manufatory = "";
__m_Engine = "";
__m_UnderPan = "";
__m_Wheel = "";
}
//显示车的信息
void showCarInfo()
{
std::cout << "Car Manufatory:" << getManufatory() << std::endl;
std::cout << " Engine:" << getEngine() << std::endl;
std::cout << " UnderPan:" << getUnderPan() << std::endl;
std::cout << " Wheel:" << getWheel() << std::endl;
}
CC_SYNTHESIZE_PRIVATE(Manufatory,__m_Manufatory,Manufatory);
CC_SYNTHESIZE_PRIVATE(Engine,__m_Engine,Engine);
CC_SYNTHESIZE_PRIVATE(UnderPan,__m_UnderPan,UnderPan);
CC_SYNTHESIZE_PRIVATE(Wheel,__m_Wheel,Wheel);
};
class CarBuilderBase//造车厂家:宝马,奔驰
{
public:
CarBuilderBase()
{
__m_Car = make_shared<Car>();
}
shared_ptr<Car> buildCar()
{
//第一步
buildManuFactory();
//第二步
buildEngine();
//第三步
buildUnderPan();
//第四步
buildWheel();
//第五步 完成一辆汽车的构造 交付这辆车
return __m_Car;
}
protected:
shared_ptr<Car> __m_Car;//需要构造的车
protected:
virtual void buildManuFactory() = 0;//构造该车本厂家的一系列部件
virtual void buildEngine() = 0; //构造引擎
virtual void buildWheel() = 0; //构造车轮(安装轮子)
virtual void buildUnderPan() = 0; //构造底盘
};
//宝马厂家构造宝马A11号车
class BaoMa_A11_Builder : public CarBuilderBase
{
virtual void buildManuFactory() //构造该车本厂家的一系列部件
{
//使用自家厂的专门用来配置A11型号车的一系列部件配置这辆车
__m_Car->setManufatory("BaoMa_A11");
}
virtual void buildEngine() //构造引擎
{
__m_Car->setEngine("解放"); //使用解放型号的引擎配置这辆车
}
virtual void buildWheel() //构造车轮(安装轮子)
{
__m_Car->setWheel("大众"); //使用大众牌的轮子
}
virtual void buildUnderPan() //构造底盘
{
__m_Car->setUnderPan("东风"); //使用东风牌的底盘
}
};
//奔驰厂家构造奔驰D31号车
class BenChi_D31_Builder : public CarBuilderBase
{
virtual void buildManuFactory() //构造该车本厂家的一系列部件
{
//使用自家厂的专门用来配置D31型号车的一系列部件配置这辆车
__m_Car->setManufatory("BenChi_D31");
}
virtual void buildEngine() //构造引擎
{
__m_Car->setEngine("ALW");
}
virtual void buildWheel() //构造车轮(安装轮子)
{
__m_Car->setWheel("CLL");
}
virtual void buildUnderPan() //构造底盘
{
__m_Car->setUnderPan("HII");
}
};
//创建汽车的指挥者:智慧要创建什么车
class BuildCarDirector
{
public:
shared_ptr<Car> BuildCar(shared_ptr<CarBuilderBase> builder)
{
return builder->buildCar();
}
};
void testBuilderMode()
{
shared_ptr<BenChi_D31_Builder> ptr_BenChi_D31 = make_shared<BenChi_D31_Builder>();
auto ptr_BaoMa_A11 = make_shared<BaoMa_A11_Builder>();
auto ptrDirector = make_shared<BuildCarDirector>();
auto ptrCarA11 = ptrDirector->BuildCar(ptr_BaoMa_A11);
auto ptrCarD31 = ptrDirector->BuildCar(ptr_BenChi_D31);
ptrCarA11->showCarInfo();
ptrCarD31->showCarInfo();
}
Builder 创建者模式 构造者模式
最新推荐文章于 2020-10-09 15:58:35 发布