要生产一个可以带有设置某些属性的对象,可以直接产生,可以定义一个创建者,其提供设置接口函数,并提供对象获取接口,将某一类产品封装起来,后面需要此产品时只需要调用创建者的创建接口就可以了。
另外可以进一步对创建者进行封装,将其封装成一个可以有多个预订设置的类(Director),这个类的每一个预订设置都提供一个创建接口,这样需要某个预订设置产品时只需要调用对应的接口就可以了。
main()
{
//不使用模式,直接产生对象
BenzModel *pBenz = new BenzModel();
pBenz->SetSequence(&seq);
pBenz->Run();
delete pBenz;
//定义设置seq
vector<string> seq;
seq.push_back("engine boom");
seq.push_back("start");
seq.push_back("stop");
//建造者benzBuilder使用seq去创建对象
BenzBuilder benzBuilder;
benzBuilder.SetSequence(&seq);
BenzModel *pBenza = dynamic_cast<BenzModel*>(benzBuilder.GetCarModel());
pBenza->Run();
//delete pBenza; //有Director的情况下,在这里delete会产生“段错误 (核心已转储)”错误
//建造者bmwBuilder使用seq去创建对象
BMWBuilder bmwBuilder;
bmwBuilder.SetSequence(&seq);
BMWModel *pBmw = dynamic_cast<BMWModel*>(bmwBuilder.GetCarModel());
pBmw->Run();
//delete pBmw; //有Director的情况下,在这里delete会产生“段错误 (核心已转储)”错误
//调用预订设置者Director的接口去创建对象
Director director;
for(int i = 0; i < 2; i++)
director.GetABenzModel()->Run();
}
另外可以进一步对创建者进行封装,将其封装成一个可以有多个预订设置的类(Director),这个类的每一个预订设置都提供一个创建接口,这样需要某个预订设置产品时只需要调用对应的接口就可以了。
main()
{
//不使用模式,直接产生对象
BenzModel *pBenz = new BenzModel();
pBenz->SetSequence(&seq);
pBenz->Run();
delete pBenz;
//定义设置seq
vector<string> seq;
seq.push_back("engine boom");
seq.push_back("start");
seq.push_back("stop");
//建造者benzBuilder使用seq去创建对象
BenzBuilder benzBuilder;
benzBuilder.SetSequence(&seq);
BenzModel *pBenza = dynamic_cast<BenzModel*>(benzBuilder.GetCarModel());
pBenza->Run();
//delete pBenza; //有Director的情况下,在这里delete会产生“段错误 (核心已转储)”错误
//建造者bmwBuilder使用seq去创建对象
BMWBuilder bmwBuilder;
bmwBuilder.SetSequence(&seq);
BMWModel *pBmw = dynamic_cast<BMWModel*>(bmwBuilder.GetCarModel());
pBmw->Run();
//delete pBmw; //有Director的情况下,在这里delete会产生“段错误 (核心已转储)”错误
//调用预订设置者Director的接口去创建对象
Director director;
for(int i = 0; i < 2; i++)
director.GetABenzModel()->Run();
}