建造者模式和原型模式 (一)

2014-11-24 08:48:24 · 作者: · 浏览: 0
一:建造者模式
所谓建造者模式,就是通过不同对象去创建一个复杂的类。
Builder 模式要解决的也正是这样的问题:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成) ,我们要要复杂对象的创建过程和这个对象的表示(展示)分
离开来, 这样做的好处就是通过一步步的进行复杂对象的构建, 由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样
先看看类图:
\
代码例子:(假设其中的鸡翅、汉堡、可乐等是已经有了的类)
[cpp]
#include
#include
#include
using namespace std;
class TaoCan
{
public:
TaoCan(){}
~TaoCan(){}
vectorv;
};
class Builder
{
public:
Builder(){}
~Builder(){}
void addfood(string foodname)
{
tc.v.push_back(foodname);
}
void create()
{
cout<<"套餐由以下食物组成"<
for(vector::iterator iter=tc.v.begin();iter!=tc.v.end();++iter)
{
cout<<*iter<<" ";
}
}
private:
TaoCan tc;
};
int main()
{
//顾客告诉服务员,服务员告诉Builder,这里将服务员和Builder合成一个
//顾客告诉服务员要:汉堡、鸡翅、可乐、薯条。
//于是...
Builder *b=new Builder();
b->addfood("汉堡");
b->addfood("鸡翅");
b->addfood("可乐");
b->addfood("薯条");
b->create();
system("pause");
return 0;
}
#include
#include
#include
using namespace std;
class TaoCan
{
public:
TaoCan(){}
~TaoCan(){}
vectorv;
};
class Builder
{
public:
Builder(){}
~Builder(){}
void addfood(string foodname)
{
tc.v.push_back(foodname);
}
void create()
{
cout<<"套餐由以下食物组成"<
for(vector::iterator iter=tc.v.begin();iter!=tc.v.end();++iter)
{
cout<<*iter<<" ";
}
}
private:
TaoCan tc;
};
int main()
{
//顾客告诉服务员,服务员告诉Builder,这里将服务员和Builder合成一个
//顾客告诉服务员要:汉堡、鸡翅、可乐、薯条。
//于是...
Builder *b=new Builder();
b->addfood("汉堡");
b->addfood("鸡翅");
b->addfood("可乐");
b->addfood("薯条");
b->create();
system("pause");
return 0;
}
二:原型模式
Prototype 模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在 C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和 系统崩溃时候的根源之一。
类图如下:
\
原型模式,说白了就是用一个对象去初始化另一个对象,达到了复制的效果。
例子代码如下:
[cpp]
#include
#include
#include
using namespace std;
class YuanXing
{
public:
YuanXing(){}
~YuanXing(){}
virtual YuanXing* clone()=0;
};
class JuTiYuanXing:public YuanXing
{
public:
JuTiYuanXing(){}
JuTiYuanXing(JuTiYuanXing &m)
{
*this=m;
}
~JuTiYuanXing(){}
JuTiYuanXing* clone()
{
return new JuTiYuanXing(*this);
}
};
int main()
{
JuTiYuanXing *aa=new JuTiYuanXing;
JuTiYuanXing *bb=aa->clone();
system("pause");
return 0;
}
#include
#include
#include
using namespace std;
class YuanXing
{
public:
YuanXing(){}
~YuanXing(){}
virtual YuanXing* clone()=0;
};
class JuTiYuanXing:public YuanXing
{
public:
JuTiYuanXing(){}
JuTiYuanXing(JuTiYuanXing &m)
{
*this=m;
}
~JuTiYuanXing(){}
JuTiYuanXing* clone()
{
return new JuTiYuanXing(*this);
}
};
int main()
{
JuTiYuan