zoukankan      html  css  js  c++  java
  • 【设计模式】建造者模式

    设计模式 之 建造者模式

    //建造者模式
    
    /************************************************************************
    【建造者】提供了建造动作的接口
    
    【具体建造者】去实现【建造者】的每个接口,对每个【具体建造者】来说,
     创建【产品】的步骤相同,不同的只是“细节”
    
    【产品】即每个【具体建造者】的实例
    
    【指挥者】中去调用创建【产品】的每个接口,利用多台性质去调用每个【具体建造者】
    实现的接口。
    
    --------------------------------------------------------------------------
    
    本文以生产不同型号的手机为例来说明,一个品牌的手机都有许多【型号】,这里的
    不同【型号】即为不同的【具体创建者】,不同【型号】的手机只是“配置”不同,
    生产手机的过程是相同的,[装主板]、[装GPS]、[装陀螺仪]、[装屏幕]、[装电池]、
    [装外壳]等。
    这些组装动作即为【建造者】提供的接口,而每个手机就是【产品】,【指挥者】可以
    理解为“装配流水线”,流水线根据不同种类的【型号】去组装不同的元器件,从而
    组装成一部手机。
    
    注:实际可能是一种型号的手机对应一条流水线,而非前文所述的一条流水线可组装
    多重型号的手机,但在这里姑且认为一条流水线对应多种型号。
    
    
    ************************************************************************/

    【建造者】类,提供了组装手机的动作接口

    //【建造者】类,提供组装手机的操作接口
    class CPhoneBuilder
    {
    public:
        CPhoneBuilder();
        virtual ~CPhoneBuilder();
        virtual void ZhuangMainbord() = 0; //装主板
        virtual void ZhuangGPS()      = 0; //装GPS
        virtual void ZhuangTuoluoyi() = 0; //装陀螺仪
        virtual void ZhuangScreen()   = 0; //装屏幕
        virtual void ZhuangWaike()    = 0; //装外壳
    };
    
    CPhoneBuilder::CPhoneBuilder(){}
    CPhoneBuilder::~CPhoneBuilder(){}

    【三星S4】,一个【具体建造者】,也是一个【型号】, 实现了【建造者】的组装手机的接口

    //【三星S4】,一个具体的建造者
    class CS4Builder : public CPhoneBuilder
    {
    public: 
        CS4Builder();
        virtual ~CS4Builder();
        virtual void ZhuangMainbord();  //装主板
        virtual void ZhuangGPS();       //装GPS
        virtual void ZhuangTuoluoyi();  //装陀螺仪
        virtual void ZhuangScreen();    //装屏幕
        virtual void ZhuangWaike();     //装外壳
    };
    
    CS4Builder::CS4Builder(){cout<<"建造三星S4
    ";}
    CS4Builder::~CS4Builder(){}
    
    void CS4Builder::ZhuangMainbord() {cout << "组装 型号A 主板
    ";}
    void CS4Builder::ZhuangGPS()      {cout << "组装 型号A GPS
    ";}
    void CS4Builder::ZhuangTuoluoyi() {cout <<" 组装 型号A 陀螺仪
    ";}
    void CS4Builder::ZhuangScreen()   {cout << "组装 型号A 大猩猩玻璃屏
    ";}
    void CS4Builder::ZhuangWaike()    {cout << "组装 金属外壳A
    ";}

    【三星S5】,一个【具体建造者】,也是一个【型号】, 实现了【建造者】的组装手机的接口

    //【三星S5】,一个具体建造者
    class CS5Builder : public CPhoneBuilder
    {
    public:
        CS5Builder();
        virtual ~CS5Builder();
        virtual void ZhuangMainbord();  //装主板
        virtual void ZhuangGPS();       //装GPS
        virtual void ZhuangTuoluoyi();  //装陀螺仪
        virtual void ZhuangScreen();    //装屏幕
        virtual void ZhuangWaike();     //装外壳
    };
    
    CS5Builder::CS5Builder() {cout << "建造三星S5
    ";}
    CS5Builder::~CS5Builder() {}
    
    void CS5Builder::ZhuangMainbord() {cout << "组装 型号C 主板
    ";}
    void CS5Builder::ZhuangGPS()      {cout << "组装 型号C GPS
    ";}
    void CS5Builder::ZhuangTuoluoyi() {cout <<" 组装 型号C 陀螺仪
    ";}
    void CS5Builder::ZhuangScreen()   {cout << "组装 型号C 大猩猩玻璃屏
    ";}
    void CS5Builder::ZhuangWaike()    {cout << "组装 塑料外壳C
    ";}

    【指挥者】类,指挥者根据传入的不同【型号】,去调用不同的【组装动作】,这些【组装动作】的细节不同,【细节】即手机的“配置”或“参数”不同,有的“为发烧而生”, 有的“忘记参数”,有的“重新定义了手机”。

    //【指挥者】类,即组装流水线
    class CLineDirector
    {
    public:
        CLineDirector();
        virtual ~CLineDirector();
    
        //建造手机(多态性质)
        void CreatePhone(CPhoneBuilder* builder);
    };
    
    CLineDirector::CLineDirector() {cout << std::endl << "准备建造手机" << std::endl<<std::endl;}
    CLineDirector::~CLineDirector(){}
    
    void CLineDirector::CreatePhone(CPhoneBuilder* builder)
    {
        if(NULL == builder) { cerr << std::endl << "不知道你要造神马手机" << std::endl; return;}
        
        builder->ZhuangMainbord();
        builder->ZhuangGPS();
        builder->ZhuangTuoluoyi();
        builder->ZhuangScreen();
        builder->ZhuangWaike();
    }

    客户端

    //客户端
    int _tmain(int argc, _TCHAR* argv[])
    {
        CLineDirector director;
    
        CS4Builder s4;
        director.CreatePhone(&s4);
        
        cout<<endl<<endl;
        
        CS5Builder s5;
        director.CreatePhone(&s5);
    
        cout<<endl<<endl;
    
        return 0;
    }

    运行情况

    PS:

    当在【指挥者】的CreatePhone函数中调用一系列组装函数时,感觉有点类似于前面的【外观模式】,又感觉有区别,

    外观模式中:【外观】类中提供了一些列函数,这些函数是对各个【子系统】的函数调用的封装,或者个数不同,或者顺序不同,并没有一个各个子系统的“基类”,也没有用到【多态】性质;

    建造者模式中:【建造者】首先是一个基类,他的多个子类(即【具体建造者】)是对该【建造者】类中的接口的不同实现,而各个子类在创建对象的时候,对这些接口(动作或操作)的步骤/调用顺序/流程 是相同的, 然后依赖于【指挥者】类中的不同输入,根据多态性质去调用不同的子类中的各个操作(去接口的实现)。

  • 相关阅读:
    javascript 闭包与函数变量作用域
    javaScript for循环
    node-inspector调试node项目
    nodejs async异步常用函数总结
    nodejs安装配置新手篇
    requirejs笔记
    使用nodejs中httpProxy代理时候出现404异常
    Bluebird-Collections
    Bluebird-Core API (三)
    Bluebird-Core API(二)
  • 原文地址:https://www.cnblogs.com/cuish/p/3773654.html
Copyright © 2011-2022 走看看