代码设计模式之建造者模式(Builder)

来源:互联网 发布:华北计算机研究所java 编辑:程序博客网 时间:2024/06/06 08:59

特点:

抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。此接口中一般至少规定两个方法,一个是创建部分的方法,例如BuilderPart,另一个是返回结果的方法,例如GetProduct,以约束具体建造者实现。
       具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序的调用下创建产品的实例。这个角色产品实现了抽象建造者接口,主要完成分步创建产品并提供产品对象的实例。
       导演者(Director)角色:顾名思义,就是具体指挥使用哪个具体创造者来完成产品的创建,是创建工作的调用者。但是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。
       产品(Product)角色:产品角色就是建造中的复杂对象。一般只有对于复杂对象的创建才使用建造者模式,一个系统中会出现多于一个的产品类,而这些产品类并不一定有共同的接口,可能完全不关联,这时就需要提供多套抽象和具体的建造者来完成不一致的产品的创建或者是采用一个统一接口来标识产品

在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。

 建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。

 

优点:

在建造者模式中,客户端不用在直接负责对象的创建,而是把这任务交给了具体的创建者类,把具体的如何组装的责任交给了Director类,客户端之负责对象的调用即可,符合单一职责原则。而且由于可以选择不同的具体的创建者,所以可以有不同的形式展现对象。

 

缺点:

创建者模式比较符合产品差别不大的对象的创建,如果差别很大,就会导致非常多的具体的创建者,这时候最好结合工厂方法模式。

 

例子:

一客户到电脑城买电脑,一般卖家都会问,买组装(DIY),还是买器牌。客户只需要告诉卖家就可以了,而卖家就是一个指挥者(Director),而品牌厂商和组装厂商就是具体的组装师(建造者),而最终的产品就是电脑(Computer)。

 

类图:

 

指挥者:

director.h

/**************************************************************          filename : director.h          author: fengsh         QQ:19985430         blog :http://blog.csdn.net/fengsh998           Builder Demo *************************************************************/  #ifndef DIRECTOR_H#define DIRECTOR_H#include "computer.h"class Director{public:Director(void);~Director(void);Computer* ConstrucComputer(ComputerBuilder* cbuilder);};#endif


director.cpp

#include "StdAfx.h"#include "director.h"Director::Director(void){}Director::~Director(void){}Computer* Director::ConstrucComputer( ComputerBuilder* cbuilder ){cbuilder->InstallChiest();cbuilder->InstallCPU();cbuilder->InstallDisplay();cbuilder->InstallDVD();cbuilder->InstallHard();cbuilder->InstallMemory();return cbuilder->ConstructComputer();}


computer

/**************************************************************          filename : computer.h          author: fengsh         QQ:19985430         blog :http://blog.csdn.net/fengsh998           Builder Demo *************************************************************/  #ifndef COMPUTER_H#define COMPUTER_H#include "string"class Computer{public:Computer(void);~Computer(void);void openPower();void viewConfig();void closePower();void setHard(const std::string& hard);void setCPU(const std::string& cpu);void setDVD(const std::string& dvd);void setDisplay(const std::string& display);void setChiest(const std::string& chiest);void setMemory(const std::string& memory);private:std::string m_hard;std::string m_cpu;std::string m_dvd;std::string m_display;std::string m_chiest;std::string m_memory;};class ComputerBuilder{public:ComputerBuilder();virtual ~ComputerBuilder(){};//一步步建造过程virtual void InstallHard()=0;virtual void InstallDisplay()=0;virtual void InstallMemory()=0;virtual void InstallDVD()=0;virtual void InstallCPU()=0;virtual void InstallChiest()=0;Computer* ConstructComputer();protected:Computer* m_ComputerCompleted;};class SonyComputerBuilder : public ComputerBuilder{public:SonyComputerBuilder(){};~SonyComputerBuilder(){};void InstallHard();void InstallDisplay();void InstallMemory();void InstallDVD();void InstallCPU();void InstallChiest();};class DiyComputerBuilder : public ComputerBuilder{public:DiyComputerBuilder(){};~DiyComputerBuilder(){};void InstallHard();void InstallDisplay();void InstallMemory();void InstallDVD();void InstallCPU();void InstallChiest();};#endif


computer.cpp

#include "StdAfx.h"#include "computer.h"#include "iostream"Computer::Computer(void){}Computer::~Computer(void){}void Computer::setHard( const std::string& hard ){m_hard = hard;}void Computer::setCPU( const std::string& cpu ){m_cpu = cpu;}void Computer::setDVD( const std::string& dvd ){m_dvd = dvd;}void Computer::setDisplay( const std::string& display ){m_display = display;}void Computer::setChiest( const std::string& chiest ){m_chiest = chiest;}void Computer::setMemory( const std::string& memory ){m_memory = memory;}void Computer::openPower(){std::cout<<"The Computer had turn on."<<std::endl;}void Computer::viewConfig(){std::cout<<m_chiest<<std::endl;std::cout<<m_cpu<<std::endl;std::cout<<m_display<<std::endl;std::cout<<m_memory<<std::endl;std::cout<<m_hard<<std::endl;std::cout<<m_dvd<<std::endl;}void Computer::closePower(){std::cout<<"The Computer had turn off."<<std::endl;}//抽象建造者类Computer* ComputerBuilder::ConstructComputer(){return m_ComputerCompleted;}ComputerBuilder::ComputerBuilder(){m_ComputerCompleted = new Computer();}//子类建告者(Sony)void SonyComputerBuilder::InstallHard(){m_ComputerCompleted->setHard("Sony Hard 500G 7200/ps");}void SonyComputerBuilder::InstallDisplay(){m_ComputerCompleted->setDisplay("Sony Display 24'");}void SonyComputerBuilder::InstallMemory(){m_ComputerCompleted->setMemory("Sony 2G DDR 400 Memory");}void SonyComputerBuilder::InstallDVD(){m_ComputerCompleted->setDVD("Sony RW DVD");}void SonyComputerBuilder::InstallCPU(){m_ComputerCompleted->setCPU("Sony CPU 3.3*1000 Hz");}void SonyComputerBuilder::InstallChiest(){m_ComputerCompleted->setChiest("Sony Chiest");}//DIY 组装电脑建造者void DiyComputerBuilder::InstallHard(){m_ComputerCompleted->setHard("日立硬盘 500 G 7200转/s");}void DiyComputerBuilder::InstallDisplay(){    m_ComputerCompleted->setDisplay("菲利浦 显示器 19'");}void DiyComputerBuilder::InstallMemory(){m_ComputerCompleted->setMemory("KingMax DDR400 4G");}void DiyComputerBuilder::InstallDVD(){m_ComputerCompleted->setDVD("三星 RW DVD");}void DiyComputerBuilder::InstallCPU(){m_ComputerCompleted->setCPU("AMD 6000+ ");}void DiyComputerBuilder::InstallChiest(){m_ComputerCompleted->setChiest("AMD Chiest");}


调用演示

#include "stdafx.h"#include "stdlib.h"#include "computer.h"#include "director.h"int _tmain(int argc, _TCHAR* argv[]){//SonyComputerBuilder* sony = new SonyComputerBuilder();DiyComputerBuilder* diy = new DiyComputerBuilder();Director* dt = new Director();Computer* cpt = dt->ConstrucComputer(diy);cpt->openPower();cpt->viewConfig();cpt->closePower();//delete sony;delete diy;delete dt;system("pause");return 0;}