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

2014-11-24 12:30:39 · 作者: · 浏览: 2
oid 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 *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;
};

carbuilder.cpp

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

}
carmodel::~carmodel()
{

}
void carmodel::SetSequence(vector *pSeq)
{
m_pSequence = pSeq;
}
void carmodel::Run()
{
vector::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..."< }
void benmodel::Stop()
{
cout<<"ben stop..."< }
void benmodel::Alarm()
{
cout<<"ben alarm..."< }
void benmodel::EngineBoom()
{
cout<<"ben engineboom..."< }

bmwmodel::bmwmodel()
{

}
bmwmodel::~bmwmodel()
{

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

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

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

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

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

director::director()
{
pBen = new benbuilder();
pBmw = new bmwbuilder();
pSequence = new vector();
}
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(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(pBen->GetCarMod