建造者模式的思考
(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;
}