您的位置:首页 > 产品设计 > UI/UE

建造者模式(Builder)-设计模式(三)

2016-08-16 11:17 459 查看
今天我们来学习建造者模式,首先当然是一大堆基本没意义的解析:

作用:

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

适用于以下情况:

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

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

抽象基类:

1)Builder:这个基类是全部创建对象过程的抽象,提供构建不同组成部分的接口函数

接口:

1)Builder::BuildPartA,Builder::BuildPartB:是对一个对象不同部分的构建函数

接口,Builder 的派生类来具体实现.

另外还有一个需要注意的函数,就是 Director::Construct 函数,这个函数里面通过调

用上面的两个接口函数完成对象的构建–也就是说各个不同部分装配的过程都是一致的

( 同样的调用的 Construct 函数),但是不同的构建方式会有不同的表示(根据 Builder

的实际类型来决定如何构建,也就是多态)

废话说完了就要举个栗子啦!

一根炸鸡腿,有里面的鸡腿、外面的面皮、还有调料啥的都可以看做是炸鸡腿的不同组成部分,当然这里的炸鸡腿就是一个对象。不同的店呢,比如说肯德基和麦当劳生产的炸鸡腿是不一样的,这就是不同的构建方法,但是炸鸡腿的组成是差不多,你当然没见过面皮在里、鸡腿在外面的炸鸡腿咯。所以,他们的构建过程是一样的(炸鸡腿的组成),即各部分的装配方式。具体的装配是怎样的,当然是有炸鸡腿决定的咯!

看一看实现咯!

#include <iostream>

using namespace std;

class Product
{
public:
Product()
{
ProducePart();
cout<<"生产炸鸡腿"<<endl;
}
~Product(){}
void ProducePart()
{
cout<<"炸鸡腿的部分组成.."<<endl;
}
};
class Builder
{
public:
virtual ~Builder(){}
virtual void BuildPartA(const string& buildPart)=0;
virtual void BuildPartB(const string& buildPart)=0;
virtual Product* GetProduct()=0;
protected:
Builder(){}
};
class ConcreteBuilder:public Builder
{
public:
ConcreteBuilder(){}
~ConcreteBuilder(){}
void BuildPartA(const string& buildPart)
{
cout<<"给鸡腿抹上面皮.."<<buildPart<<endl;
}
void BuildPartB(const string& buildPart)
{
cout<<"给鸡腿撒上调料"<<buildPart<<endl;
}
Product* GetProduct()
{
BuildPartA("抹面皮完成");
BuildPartB("撒调料完毕");
return new Product();
}
};
class Director
{
public:
Director(Builder* bld)
{
_bld = bld;
}
~Director(){}
void Construct()
{
_bld->BuildPartA("肯德基抹面皮");
_bld->BuildPartB("肯德基撒调料");
}
private:
Builder* _bld;
};
int main()
{
Director* d = new Director(new ConcreteBuilder());
d->Construct();
return 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息