c++ 设计模式之生成器模式

来源:岁月联盟 编辑:exp 时间:2011-12-19

个人感觉这个模式,使用的应该较少,主要应用于流程性的东西,废话不多说,让我们进入生成器模式。

意图:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

适用性:

1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时

2、当构造过程必须允许被构造的对象有不同的表示时

使用生成器模式的基本方法:

1、需要抽象出一个基类,所有的对象创建时,都继承自这个基类创建。

2、需要创建一个调用的导演,由它来多态到不同的表现。(它并不继承自那个抽象基类,而是存储一个抽象基类的指针,类似多态)。

3、各个具体对象实例化基类的接口

看一个生成器模式的基本结构例子,本例子从http://www.cppblog.com/converse/archive/2006/07/21/10305.html,整理,仅供学习使用:

builder.h

//设计模式之builder模式  
/*
作用:将一个复杂对象的构建与它的表示分离,使同样的构建过程创建不同的表示
*/ 
//虚拟基类,所有builder的基类,提供不同部分的构建接口  
class builder 

public: 
    builder(){}; 
    virtual ~builder(){}; 
 
    //提供构建接口  
    virtual void builderA() = 0; 
    virtual void builderB() = 0; 
}; 
 
//使用builder构建产品,构建产品的过程都一致,但是不同的builder会有不同的表现  
//这个不同的实现通过不同的builder派生类来实现,存有一个builder的指针,多态调用  
class director 
{//  
public: 
    director(builder *pbuilder); 
    virtual ~director(); 
 
    void construct(); 
private: 
    builder *pBuilder; 
}; 
//具体实例化各个建造者  
class concretebuilder1:public builder 

public: 
    concretebuilder1(){} 
    virtual ~concretebuilder1(){} 
    virtual void builderA(); 
    virtual void builderB(); 
}; 
//具体实例化各个建造者  
class concretebuilder2:public builder 

public: 
    concretebuilder2(){} 
    virtual ~concretebuilder2(){} 
 
    virtual void builderA(); 
    virtual void builderB(); 
}; 
//设计模式之builder模式
/*
作用:将一个复杂对象的构建与它的表示分离,使同样的构建过程创建不同的表示
*/
//虚拟基类,所有builder的基类,提供不同部分的构建接口
class builder
{
public:
 builder(){};
 virtual ~builder(){};

 //提供构建接口
 virtual void builderA() = 0;
 virtual void builderB() = 0;
};

//使用builder构建产品,构建产品的过程都一致,但是不同的builder会有不同的表现
//这个不同的实现通过不同的builder派生类来实现,存有一个builder的指针,多态调用
class director
{//
public:
 director(builder *pbuilder);
 virtual ~director();

 void construct();
private:
 builder *pBuilder;
};
//具体实例化各个建造者
class concretebuilder1:public builder
{
public:
 concretebuilder1(){}
 virtual ~concretebuilder1(){}
 virtual void builderA();
 virtual void builderB();
};
//具体实例化各个建造者
class concretebuilder2:public builder
{
public:
 concretebuilder2(){}
 virtual ~concretebuilder2(){}

 virtual void builderA();
 virtual void builderB();
};
 

builder.cpp

#include "builder.h"  
#include <stdio.h>  
 
void concretebuilder1::builderA() 

    printf("builderA by concretebuilder1/n"); 

 
void concretebuilder1::builderB() 

    printf("builderB by concretebuilder1/n"); 

 
void concretebuilder2::builderA() 

    printf("builderA by concretebuilder2/n"); 

 
void concretebuilder2::builderB() 

    printf("builderB by concretebuilder2/n"); 

 
director::director(builder *pbuilder) 

    this->pBuilder = pbuilder; 

director::~director() 

    delete pBuilder; 
    pBuilder = NULL; 

 
void director::construct() 

    //将同一个过程的表示组装一下  
    pBuilder->builderA(); 
    pBuilder->builderB(); 

 
 
void main() 

    //调用时,需要注意一下,具体想创建哪个表示,就实例化哪个  
    builder *pbuilder1 = new concretebuilder1; 
    //通过导演,可以将表示提取出来  
    director *pdirector = new director(pbuilder1); 
    //具体操作,就可以由导演代劳了。  
    pdirector->construct(); 
 
    builder *pbuilder2 = new concretebuilder2; 
    director *pdirector2 = new director(pbuilder2); 
    pdirector2->construct(); 
 
    delete pdirector; 
    delete pdirector2; 
 

#include "builder.h"
#include <stdio.h>

void concretebuilder1::builderA()
{
 printf("builderA by concretebuilder1/n");
}

void concretebuilder1::builderB()
{
 printf("builderB by concretebuilder1/n");
}

void concretebuilder2::builderA()
{
 printf("builderA by concretebuilder2/n");
}

void concretebuilder2::builderB()
{
 printf("builderB by concretebuilder2/n");
}

director::director(builder *pbuilder)
{
 this->pBuilder = pbuilder;
}
director::~director()
{
 delete pBuilder;
 pBuilder = NULL;
}

void director::construct()
{
 //将同一个过程的表示组装一下
 pBuilder->builderA();
 pBuilder->builderB();
}


void main()
{
 //调用时,需要注意一下,具体想创建哪个表示,就实例化哪个
 builder *pbuilder1 = new concretebuilder1;
 //通过导演,可以将表示提取出来
 director *pdirector = new director(pbuilder1);
 //具体操作,就可以由导演代劳了。
 pdirector->construct();

 builder *pbuilder2 = new concretebuilder2;
 director *pdirector2 = new director(pbuilder2);
 pdirector2->construct();

 delete pdirector;
 delete pdirector2;

}
 

分析代码的时候主要看类的结构关系,以及具体的使用方法。

下面让我们看一个具体的例子。

例子主要从http://www.cnblogs.com/wanggary/archive/2011/04/15/2017615.html,得来的,仅供学习使用。

carbuilder.h

/*
客户模型:
carmodel:汽车模型
benmodel:奔驰汽车
bmwmodel:宝马汽车
carbuilder:建造者接口
benbuilder:奔驰建造者
bmwbuilder:宝马建造者
director:导演
*/ 
 
#include <vector>  
#include <string>  
#include <iostream>  
using namespace std; 
 
//首先虚拟出一个汽车模型  
class carmodel 

public: 
    carmodel(); 
    virtual ~carmodel(); 
    void Run(); 
    void SetSequence(vector<string> *pSeq); 
 
protected: 
    //定义出一系列操作  
    virtual void Start() = 0; 
    virtual void Stop() = 0; 
    virtual void Alarm() = 0; 
    virtual void EngineBoom() = 0; 
private: 
    vector<string> *m_pSequence; 
}; 
//根据汽车模型构建奔驰汽车  
class benmodel:public carmodel 

public: 
    benmodel(); 
    ~benmodel(); 
protected: 
    void Start(); 
    void Stop(); 
    void Alarm(); 
    void EngineBoom(); 
 
}; 
//根据汽车模型构建宝马汽车   www.2cto.com
class bmwmodel:public carmodel 

public: 
    bmwmodel(); 
    ~bmwmodel(); 
protected: 
    void Start(); 
    void Stop(); 
    void Alarm(); 
    void EngineBoom(); 
 
}; 
//虚拟出一个汽车的建造者模型  
//类似于上面说的那个抽象基类  
class carbuilder 

public: 
    carbuilder() 
    { 
 
    } 
    virtual ~carbuilder() 
    { 
 
    } 
    virtual void SetSequence(vector<string> *pSeq) = 0; 
    virtual carmodel* GetCarModel() = 0; 
}; 
//创建一个奔驰汽车  
class benbuilder:public carbuilder 

public: 
    benbuilder(); 
    ~benbuilder(); 
    void SetSequence(vector<string> *pSeq); 
    carmodel* GetCarModel(); 
private: 
    carmodel *pBen; 
}; 
//创建一个奔驰汽车  
class bmwbuilder:public carbuilder 

public: 
    bmwbuilder(); 
    ~bmwbuilder(); 
    void SetSequence(vector<string> *pSeq); 
    carmodel* GetCarModel(); 
private: 
    carmodel *pBmw; 
}; 
 
//这个就是导演,  
class director 

public: 
    director(); 
    ~director(); 
    benmodel* GetABenModel(); 
    benmodel* GetBBenModel(); 
    bmwmodel* GetCBmwModel(); 
    bmwmodel* GetDBmwModel(); 
private: 
    vector<string> *pSequence; 
    benbuilder *pBen; 
    bmwbuilder *pBmw; 
}; 
/*
客户模型:
carmodel:汽车模型
benmodel:奔驰汽车
bmwmodel:宝马汽车
carbuilder:建造者接口
benbuilder:奔驰建造者
bmwbuilder:宝马建造者
director:导演
*/

#include <vector>
#include <string>
#include <iostream>
using namespace std;

//首先虚拟出一个汽车模型
class carmodel
{
public:
 carmodel();
 virtual ~carmodel();
 void Run();
 void SetSequence(vector<string> *pSeq);

protected:
 //定义出一系列操作
 virtual void Start() = 0;
 virtual void Stop() = 0;
 virtual void Alarm() = 0;
 virtual void EngineBoom() = 0;
private:
 vector<string> *m_pSequence;
};
//根据汽车模型构建奔驰汽车
class benmodel:public carmodel
{
public:
 benmodel();
 ~benmodel();
protected:
 void Start();
 void Stop();
 void Alarm();
 void EngineBoom();

};
//根据汽车模型构建宝马汽车
class bmwmodel:public carmodel
{
public:
 bmwmodel();
 ~bmwmodel();
protected:
 void Start();
 void Stop();
 void Alarm();
 void EngineBoom();

};
//虚拟出一个汽车的建造者模型
//类似于上面说的那个抽象基类
class carbuilder
{
public:
 carbuilder()
 {

 }
 virtual ~carbuilder()
 {

 }
 virtual void SetSequence(vector<string> *pSeq) = 0;
 virtual carmodel* GetCarModel() = 0;
};
//创建一个奔驰汽车
class benbuilder:public carbuilder
{
public:
 benbuilder();
 ~benbuilder();
 void SetSequence(vector<string> *pSeq);
 carmodel* GetCarModel();
private:
 carmodel *pBen;
};
//创建一个奔驰汽车
class bmwbuilder:public carbuilder
{
public:
 bmwbuilder();
 ~bmwbuilder();
 void SetSequence(vector<string> *pSeq);
 carmodel* GetCarModel();
private:
 carmodel *pBmw;
};

//这个就是导演,
class director
{
public:
 director();
 ~director();
 benmodel* GetABenModel();
 benmodel* GetBBenModel();
 bmwmodel* GetCBmwModel();
 bmwmodel* GetDBmwModel();
private:
 vector<string> *pSequence;
 benbuilder *pBen;
 bmwbuilder *pBmw;
};
 

carbuilder.cpp

#include"carbuilder.h"  
carmodel::carmodel() 

 

carmodel::~carmodel() 

 

void carmodel::SetSequence(vector<string> *pSeq) 

    m_pSequence = pSeq; 

void carmodel::Run() 

    vector<string>::const_iterator it = m_pSequence->begin(); 
    for(;it != m_pSequence->end();++it ) 
    { 
        string actionName = *it; 
        if(actionName.compare("start") == 0) 
        { 
            Start(); 
        } 
        else if(actionName.compare("stop") == 0) 
        { 
            Stop(); 
        } 
        else if(actionName.compare("alarm") == 0) 
        { 
            Alarm(); 
        } 
        else if(actionName.compare("engine boom") == 0) 
        { 
            EngineBoom(); 
        } 
    } 

 
benmodel::benmodel() 

 

benmodel::~benmodel() 

 

void benmodel::Start() 

    cout<<"ben start..."<<endl; 

void benmodel::Stop() 

    cout<<"ben stop..."<<endl; 

void benmodel::Alarm() 

    cout<<"ben alarm..."<<endl; 

void benmodel::EngineBoom() 

    cout<<"ben engineboom..."<<endl; 

 
bmwmodel::bmwmodel() 

 

bmwmodel::~bmwmodel() 

 

void bmwmodel::Start() 

    cout<<"bmw start..."<<endl; 

void bmwmodel::Stop() 

    cout<<"bmw stop..."<<endl; 

void bmwmodel::Alarm() 

    cout<<"bmw alarm..."<<endl; 

void bmwmodel::EngineBoom() 

    cout<<"bmw engineboom..."<<endl; 

 
benbuilder::benbuilder() 

    //在构造函数中创建奔驰汽车的模型  
    pBen = new benmodel(); 

benbuilder::~benbuilder() 

 

carmodel* benbuilder::GetCarModel() 

    return pBen; 

void benbuilder::SetSequence(vector<string> *pSeq) 

    pBen->SetSequence(pSeq); 

 
bmwbuilder::bmwbuilder() 

    //在构造函数中创建宝马汽车的模型  
    pBmw = new bmwmodel(); 

bmwbuilder::~bmwbuilder() 

 

carmodel* bmwbuilder::GetCarModel() 

    return pBmw; 

void bmwbuilder::SetSequence(vector<string> *pSeq) 

    pBmw->SetSequence(pSeq); 

 
director::director() 

    pBen = new benbuilder(); 
    pBmw = new bmwbuilder(); 
    pSequence = new vector<string>(); 

director::~director() 

    delete pBen; 
    delete pBmw; 
    delete pSequence; 

benmodel * director::GetABenModel() 

    pSequence->clear(); 
    pSequence->push_back("start"); 
    pSequence->push_back("stop"); 
    pBen->SetSequence(pSequence); 
    return dynamic_cast<benmodel*>(pBen->GetCarModel()); 

benmodel * director::GetBBenModel() 

    pSequence->clear(); 
    pSequence->push_back("start"); 
    pSequence->push_back("Alarm"); 
    pSequence->push_back("Stop"); 
    pBen->SetSequence(pSequence); 
    return dynamic_cast<benmodel*>(pBen->GetCarModel()); 

bmwmodel *director::GetCBmwModel() 

    pSequence->clear(); 
    pSequence->push_back("start"); 
    pSequence->push_back("stop"); 
    pBmw->SetSequence(pSequence); 
    return dynamic_cast<bmwmodel*>(pBmw->GetCarModel()); 

 
bmwmodel *director::GetDBmwModel() 

    pSequence->clear(); 
    pSequence->push_back("start"); 
    pSequence->push_back("Engineboom"); 
    pBmw->SetSequence(pSequence); 
    return dynamic_cast<bmwmodel*>(pBmw->GetCarModel()); 

int main() 

    director *pdir = new director; 
 
    benmodel *pben = pdir->GetABenModel(); 
    pben->Run(); 
 
    bmwmodel *pbmw = pdir->GetCBmwModel(); 
    pbmw->Run(); 
    delete pdir; 
    return 0; 

#include"carbuilder.h"
carmodel::carmodel()
{

}
carmodel::~carmodel()
{

}
void carmodel::SetSequence(vector<string> *pSeq)
{
 m_pSequence = pSeq;
}
void carmodel::Run()
{
 vector<string>::const_iterator it = m_pSequence->begin();
 for(;it != m_pSequence->end();++it )
 {
  string actionName = *it;
  if(actionName.compare("start") == 0)
  {
   Start();
  }
  else if(actionName.compare("stop") == 0)
  {
   Stop();
  }
  else if(actionName.compare("alarm") == 0)
  {
   Alarm();
  }
  else if(actionName.compare("engine boom") == 0)
  {
   EngineBoom();
  }
 }
}

benmodel::benmodel()
{

}
benmodel::~benmodel()
{

}
void benmodel::Start()
{
 cout<<"ben start..."<<endl;
}
void benmodel::Stop()
{
 cout<<"ben stop..."<<endl;
}
void benmodel::Alarm()
{
 cout<<"ben alarm..."<<endl;
}
void benmodel::EngineBoom()
{
 cout<<"ben engineboom..."<<endl;
}

bmwmodel::bmwmodel()
{

}
bmwmodel::~bmwmodel()
{

}
void bmwmodel::Start()
{
 cout<<"bmw start..."<<endl;
}
void bmwmodel::Stop()
{
 cout<<"bmw stop..."<<endl;
}
void bmwmodel::Alarm()
{
 cout<<"bmw alarm..."<<endl;
}
void bmwmodel::EngineBoom()
{
 cout<<"bmw engineboom..."<<endl;
}

benbuilder::benbuilder()
{
 //在构造函数中创建奔驰汽车的模型
 pBen = new benmodel();
}
benbuilder::~benbuilder()
{

}
carmodel* benbuilder::GetCarModel()
{
 return pBen;
}
void benbuilder::SetSequence(vector<string> *pSeq)
{
 pBen->SetSequence(pSeq);
}

bmwbuilder::bmwbuilder()
{
 //在构造函数中创建宝马汽车的模型
 pBmw = new bmwmodel();
}
bmwbuilder::~bmwbuilder()
{

}
carmodel* bmwbuilder::GetCarModel()
{
 return pBmw;
}
void bmwbuilder::SetSequence(vector<string> *pSeq)
{
 pBmw->SetSequence(pSeq);
}

director::director()
{
 pBen = new benbuilder();
 pBmw = new bmwbuilder();
 pSequence = new vector<string>();
}
director::~director()
{
 delete pBen;
 delete pBmw;
 delete pSequence;
}
benmodel * director::GetABenModel()
{
 pSequence->clear();
 pSequence->push_back("start");
 pSequence->push_back("stop");
 pBen->SetSequence(pSequence);
 return dynamic_cast<benmodel*>(pBen->GetCarModel());
}
benmodel * director::GetBBenModel()
{
 pSequence->clear();
 pSequence->push_back("start");
 pSequence->push_back("Alarm");
 pSequence->push_back("Stop");
 pBen->SetSequence(pSequence);
 return dynamic_cast<benmodel*>(pBen->GetCarModel());
}
bmwmodel *director::GetCBmwModel()
{
 pSequence->clear();
 pSequence->push_back("start");
 pSequence->push_back("stop");
 pBmw->SetSequence(pSequence);
 return dynamic_cast<bmwmodel*>(pBmw->GetCarModel());
}

bmwmodel *director::GetDBmwModel()
{
 pSequence->clear();
 pSequence->push_back("start");
 pSequence->push_back("Engineboom");
 pBmw->SetSequence(pSequence);
 return dynamic_cast<bmwmodel*>(pBmw->GetCarModel());
}
int main()
{
 director *pdir = new director;

 benmodel *pben = pdir->GetABenModel();
 pben->Run();

 bmwmodel *pbmw = pdir->GetCBmwModel();
 pbmw->Run();
 delete pdir;
 return 0;
}


 摘自 lbqBraveheart的专栏