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