Creational.Builder(创建型模式—建造者模式)

建造者模式的思考

(1)建造者模式的功能:构建复杂的产品,而且是细化的、分步骤的构建产品。也就是其重在一步一步解决构造复杂对象的问题。

  ①构建的过程是统一的、固定不变的(则指导者来制定)。变化的是的每步的具体的实现,由建造者来实现。

  ②建造者模式的重心在于分离构建算法具体构造的实现

(2)建造者模式的构成——两个部分

  ①Builder接口:这里定义了如何构建各个部件,也就是知道每个部件的功能是如何实现的,以及如何装配这些部件到产品中去。即部件构造和产品装配

  ②Director知道按什么流程来构建产品,负责整体的构建算法,通常是分步骤来执行。这里要强调的是,整体构建算法是固定的。当Director实现整体构建算法的时候,遇到需要创建和组合具体部件的时候,就会把这些具体的实现委托给Builder去完成

【编程实验】建造神舟飞船

//声明文件

//创建型模式:建造者模式
//神舟飞船的组装
#include <stdio.h>
#include <string>

using namespace std;


//Creational.Builder(创建型模式—建造者模式)
//*************************辅助类:各个部件************************
//轨道舱
class COrbitalModule{
private:
	string strDevice;
public:
	COrbitalModule(string device);
	void SetDev(string device);
	string GetDev();
};

//发动机
class CEngine{
private:
	string strDevice;
public:
	CEngine(string device);
	void SetDev(string device);
	string GetDev();
};

//逃逸塔
class CEscapeTower{
private:
	string strDevice;
public:
	CEscapeTower(string device);
	void SetDev(string device);
	string GetDev();
};

//最终产品Product
class CAirShip{
	COrbitalModule* pOrbitalModule;//轨道舱
	CEngine* pEngine;//发动机
	CEscapeTower* pEscapeTower;//逃逸塔
public:
	CAirShip();
	void SetOrbitalModule(COrbitalModule* orbitalmodule);
	COrbitalModule* GetOrbitalModule();
	void SetEngine(CEngine* engine);
	CEngine* GetEngine();
	void SetEscapeTower(CEscapeTower* escapetower);
	CEscapeTower* GetEscapeTower();
	void Launch();
};

//*******************************************Builder:建造者*****************************
//抽象建造者
class CAbsAirShipBuilder{
public:
	virtual void BuildOrbitalModule() = 0;//构建轨道舱
	virtual void BuildEngine() = 0;//构建发动机
	virtual void BuildEscapeTower() = 0;//构建逃逸塔
};
//具体建造者
class CAirShipBuilder : public CAbsAirShipBuilder{
private:
	CAirShip* pAirShip;
public:
	CAirShipBuilder();
	~CAirShipBuilder();
	 //OrbitalModule部件的构建
	void BuildOrbitalModule();
	//Engine部件的构建
	void BuildEngine();
	//EscapeTower部件的构建
	void BuildEscapeTower();
	 //返回最终的整个产品(神舟飞船)
	CAirShip* GetAirShip();
};
//********************************Director:指导者******************************
class CAirShipDirector{
private:
	CAbsAirShipBuilder* pBuilder;
public:
	CAirShipDirector(CAbsAirShipBuilder* builder);
	 //构建过程
    //1、建造者所构建的各部分是可以是先后顺序的,但本例这个顺序不明显或无关紧要。
    //2、本类中只有构建的过程(流程,也就算法),组装过程放在Builder类中。
	void ProductByStep();
};

//实现文件

//*************************辅助类:各个部件************************
//轨道舱
COrbitalModule::COrbitalModule(string device) : strDevice(device) {}
void COrbitalModule::SetDev(string device){strDevice = device;}
string COrbitalModule::GetDev(){return strDevice;}

//发动机
CEngine::CEngine(string device) : strDevice(device) {}
void CEngine::SetDev(string device){strDevice = device;}
string CEngine::GetDev(){return strDevice;}
//逃逸塔
CEscapeTower::CEscapeTower(string device) : strDevice(device) {}
void CEscapeTower::SetDev(string device){strDevice = device;}
string CEscapeTower::GetDev(){return strDevice;}
//最终产品Product
CAirShip::CAirShip(){ pOrbitalModule = NULL; pEngine = NULL; pEscapeTower = NULL; }
void CAirShip::SetOrbitalModule(COrbitalModule* orbitalmodule){pOrbitalModule = orbitalmodule;}
COrbitalModule* CAirShip::GetOrbitalModule(){return pOrbitalModule;}
void CAirShip::SetEngine(CEngine* engine){pEngine = engine;}
CEngine* CAirShip::GetEngine(){return pEngine;}
void CAirShip::SetEscapeTower(CEscapeTower* escapetower){pEscapeTower = escapetower;}
CEscapeTower* CAirShip::GetEscapeTower(){return pEscapeTower;}
void CAirShip::Launch()
{
	cout << pOrbitalModule->GetDev() << "准备就绪" << endl;//检测轨道舱是否正常
	cout << pEngine->GetDev() << "准备就绪" << endl;//检测发动机是否正常
	cout << pEscapeTower->GetDev() << "准备就绪" << endl;//检测逃逸塔是否正常
	cout << "准备发射" << endl;//发射
}

//*******************************************Builder:建造者*****************************
//抽象建造者
//具体建造者
CAirShipBuilder::CAirShipBuilder(){pAirShip = new CAirShip();}
CAirShipBuilder::~CAirShipBuilder()
{
	if(pAirShip != NULL){
		if(pAirShip->GetOrbitalModule() != NULL)		delete pAirShip->GetOrbitalModule();
		if(pAirShip->GetEngine() != NULL)					delete pAirShip->GetEngine();
		if(pAirShip->GetEscapeTower() != NULL)			delete pAirShip->GetEscapeTower();
		delete pAirShip;
	}
}
//OrbitalModule部件的构建
void CAirShipBuilder::BuildOrbitalModule()
{
	if(pAirShip->GetOrbitalModule() != NULL)		delete pAirShip->GetOrbitalModule();
	pAirShip->SetOrbitalModule(new COrbitalModule("太空舱的轨道舱"));//组装工作
}
//Engine部件的构建
void CAirShipBuilder::BuildEngine()
{
	if(pAirShip->GetEngine() != NULL)			delete pAirShip->GetEngine();
	pAirShip->SetEngine(new CEngine("太空舱的发动机"));//组装工作
}
//EscapeTower部件的构建
void CAirShipBuilder::BuildEscapeTower()
{
	if(pAirShip->GetEscapeTower() != NULL)		delete pAirShip->GetEscapeTower();
	pAirShip->SetEscapeTower(new CEscapeTower("太空舱的逃逸塔"));
}
//返回最终的整个产品(神舟飞船)
CAirShip* CAirShipBuilder::GetAirShip(){return pAirShip;}
//********************************Director:指导者******************************
CAirShipDirector::CAirShipDirector(CAbsAirShipBuilder* builder) : pBuilder(builder){}
//构建过程
//1、建造者所构建的各部分是可以是先后顺序的,但本例这个顺序不明显或无关紧要。
//2、本类中只有构建的过程(流程,也就算法),组装过程放在Builder类中。
void CAirShipDirector::ProductByStep()
{
	//1.先构建发动机
	pBuilder->BuildEngine();
	//2.再构建轨道舱
	pBuilder->BuildOrbitalModule();
	//3.最后构建逃逸塔
	pBuilder->BuildEscapeTower();
}

//测试客户端

void main()
{
	//构建者
	CAirShipBuilder* pBuilder = new CAirShipBuilder();
	//指导者
	CAirShipDirector* pDirector = new CAirShipDirector(pBuilder);
	pDirector->ProductByStep(); 
	//生成最终产品
	CAirShip* pAirShip = pBuilder->GetAirShip();
	pAirShip->Launch();

	delete pBuilder;
	delete pDirector;
}

猜你喜欢

转载自blog.csdn.net/KnightOnHourse/article/details/79960234