您的位置:首页 > 其它

设计模式五:Prototype原型模式——对象创建型模式

2012-05-18 21:38 435 查看
Prototype原型模式——对象创建型模式

1.意图
用原型示例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。
“创建一个对象,用一个原型指定它的种类,拷贝只是一种手法,不是目的。”

2.适用性
当一个系统应独立于它的产品创建、构成和表示时要用prototype模式
要实例化的类在运行时刻指定的
为了避免创建一个与产品类层次平行的工厂类层次时
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并且克隆他们可能比每次用合适的状态手工实例化更加方便一些。

3.结构

参考:/article/5754016.html





4.参与者
prototype
声明一个克隆自身的接口
concretePrototype
实现一个克隆自身的操作
client
让一个原型克隆自身从而创建一个新的对象

5.协作
客户请求原型克隆自身

6.效果
对客户隐藏了具体的产品类,因此减少了客户知道的名字和数目。此外这些模式使得客户无需改变就可以使用与特定应用相关的类。
1)运行时刻增加和删除产品
允许只通过客户注册原型实例就可以将一个新的具体产品类并入系统,比创建型模式更加灵活
2)改变值以制定新对象
可以通过对象复合定义新的行为,你通过实例化已有类并且将这些实例注册为客户对象的原型,就可以有效定义新类别的对象。客户可以将职责代理给原型,从而表现出新的行为。
3)改变结构以制定新的对象
由部件和子部件来创建对象。
4)减少子类的构造
5)用类动态配置应用
运行时刻环境允许你动态将类装载到应用中

7.实现
在C++这样的静态语言中,类不是对象,并且在运行时刻能得到很少或者得不到任何的信息,在这样的场景中Prototype特别有用。
需要考虑的问题
1)使用一个原型管理器
当一个系统中的原型数目不固定时,要保持一个可用原型的注册表。客户不会自己管理但是会在注册表中存储和检索原型。
2)实现克隆操作
c++中的缺省拷贝构造器实现按成员拷贝,那么就意味着复制对象和源对象是共享指针的。
有时候需要各自独立,那么就需要深拷贝
3)初始化克隆对象
可能需要用一些值来初始化该对象的一些或者所有的内部状态。

8.代码示例

#include<iostream>
#include<string>
using namespace std;

class prototype
{
public:
virtual prototype *clone(){};
};
class concretePrototype:public prototype
{
public:
concretePrototype(string str = "concretePrototype")
{
name = str;
}
concretePrototype(concretePrototype &cpy)
{
cout<<"concretePrototype copying...\n"<<cpy.name<<endl;
}
prototype *clone()
{
return new concretePrototype(*this);
}
string name;
};

int main()
{
prototype *p = new concretePrototype("first object");
prototype *pp = p->clone();
return 0;
}


9.相关模式
AbstractFactory和prototype在某种意义上是相互竞争的。但是也可以一起使用
大量使用composite和decorator模式的设计也可以从prototype中获益
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: