c++ 设计模式之生成器模式 (二)

2014-11-24 12:30:39 · 作者: · 浏览: 1
lder1::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
#include
#include
using namespace std;

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

protected:
//定义出一系列操作
virtual void Start() = 0;
virtual void Stop() = 0;
virtual void Alarm() = 0;
virtual void EngineBoom() = 0;
private:
vector *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 *pSeq) = 0;
virtual carmodel* GetCarModel() = 0;
};
//创建一个奔驰汽车
class benbuilder:public carbuilder
{
public:
benbuilder();
~benbuilder();
void SetSequence(vector *pSeq);
carmodel* GetCarModel();
private:
carmodel *pBen;
};
//创建一个奔驰汽车
class bmwbuilder:public carbuilder
{
public:
bmwbuilder();
~bmwbuilder();
void SetSequence(vector *pSeq);
carmodel* GetCarModel();
private:
carmodel *pBmw;
};

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

#include
#include
#include
using namespace std;

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

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