Builder 创建者模式 构造者模式

#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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值