当前位置:编程学习 > C/C++ >>

设计模式C++描述----07.建造者(Builder)模式

一. 概述


Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。

二. 举例

KFC 与 Mcdonalds 的汉堡生成过程大致都是一样的,假设分为4个步骤;

但是 KFC 与 Mcdonalds 的汉堡味道有所差别,主要是在每一步的细节上有所不同。

顾客要吃汉堡并不关心具体的生产步骤,其实汉堡店也不关心,因为数百年来,这些步骤者是相同的,差别只在细节上。比如盐放多少,辣椒放多少等等。

结构如下:

 \

Builder:为最基本的生产步骤

KFCBuilder:为KFC的具体生产步骤

MCDBuilder:为Mcdonalds的具体生产步骤

Director:为指挥者,用它来控件建造过程


[cpp] //////////////////////////////////////////////////////////////////////////  
//建造者  
class Builder 

public: 
    virtual ~Builder() 
    { 
    } 
 
    virtual void BuildSetp1() = 0; 
    virtual void BuildSetp2() = 0; 
    virtual void BuildSetp3() = 0; 
    virtual void BuildSetp4() = 0; 
}; 
 
//KFC 具体建造者  
class KFCBuilder:public Builder 

public: 
    void BuildSetp1() 
    { 
        cout<<"KFC Step1:"<<endl; 
    } 
 
    void BuildSetp2() 
    { 
        cout<<"KFC Step2:"<<endl; 
    } 
 
    void BuildSetp3() 
    { 
        cout<<"KFC Step3:"<<endl; 
    } 
 
    void BuildSetp4() 
    { 
            cout<<"KFC Step4:"<<endl; 
    } 
 
}; 
 
//Mcdonalds 具体建造者  
class MCDBuilder:public Builder 

public: 
    void BuildSetp1() 
    { 
        cout<<"Mcdonalds Step1:"<<endl; 
    } 
     
    void BuildSetp2() 
    { 
        cout<<"Mcdonalds Step2:"<<endl; 
    } 
     
    void BuildSetp3() 
    { 
        cout<<"Mcdonalds Step3:"<<endl; 
    } 
     
    void BuildSetp4() 
    { 
        cout<<"Mcdonalds Step4:"<<endl; 
    } 
     
}; 
 
//////////////////////////////////////////////////////////////////////////  
//指挥者  
class Director 

private:   
    Builder *m_pBuilder;   
 
public:   
    Director(Builder *builder) 
    { 
        m_pBuilder = builder; 
    } 
     
    void Create() 
    { 
        m_pBuilder->BuildSetp1();   
        m_pBuilder->BuildSetp2();   
        m_pBuilder->BuildSetp3();   
        m_pBuilder->BuildSetp4();   
    }   
}; 
 
 
//////////////////////////////////////////////////////////////////////////  
//测试代码  
int main(int argc,char* argv[]) 

    KFCBuilder kfc; //想吃KFC  
  
    Director director(&kfc);   
    director.Create();   
     
    return 0; 

//////////////////////////////////////////////////////////////////////////
//建造者
class Builder
{
public:
    virtual ~Builder()
    {
    }

    virtual void BuildSetp1() = 0;
    virtual void BuildSetp2() = 0;
    virtual void BuildSetp3() = 0;
    virtual void BuildSetp4() = 0;
};

//KFC 具体建造者
class KFCBuilder:public Builder
{
public:
    void BuildSetp1()
    {
        cout<<"KFC Step1:"<<endl;
    }

    void BuildSetp2()
    {
        cout<<"KFC Step2:"<<endl;
    }

    void BuildSetp3()
    {
        cout<<"KFC Step3:"<<endl;
    }

    void BuildSetp4()
    {
            cout<<"KFC Step4:"<<endl;
    }

};

//Mcdonalds 具体建造者
class MCDBuilder:public Builder
{
public:
    void BuildSetp1()
    {
        cout<<"Mcdonalds Step1:"<<endl;
    }
   
    void BuildSetp2()
    {
        cout<<"Mcdonalds Step2:"<<endl;
    }
   
    void BuildSetp3()
    {
        cout<<"Mcdonalds Step3:"<<endl;
    }
   
    void BuildSetp4()
    {
        cout<<"Mcdonalds Step4:"<<endl;
    }
   
};

//////////////////////////////////////////////////////////////////////////
//指挥者
class Director
{
private: 
    Builder *m_pBuilder; 

public: 
    Director(Builde

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,