菜鸟学设计模式系列笔记之Prototype模式:
Intent: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
Motivation:以一个已有的对象作为原型,通过它来创建新的对象。
在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来。
应用场景:
(1)当一个系统应该独立于它的产品创建、构成和表示时
(2)当要实例化的类是在运行时刻指定时,例如动态加载
(3)为了避免创建一个产品类层次平行的工厂类层次时
(4)当一个类的实例只能有几个不同状态组合中的一种时
主要实现:申明一个克隆自身的接口;实现一个克隆自身的接口;让一个原型克隆自身从而创建一个新的对象
模式分析:
通常情况下,一个类包含一些成员对象,在使用原型模式克隆对象时,根据其成员对象是否也克隆,原型模式可以分为两种形式:深克隆、浅克隆
在浅克隆中,当对象被复制时它所包含的成员对象没有被复制
在深克隆中,除了对象本身被复制外,对象包含的引用也被复制,也就是其中的成员对象也将复制
在java语言中,通过覆盖Object类的clone()方法可以实现浅克隆;如果需要实现深克隆,可以通过序列化等方式来实现。
两种形式比较:
(1)简单形式和登记形式各有所长
(2)如果需要创建原型对象数目较少而且比较固定的话,可采用简单形式,原型对象的引用可由客户端自己保存
(3)如果要创建的原型对象数目不固定的话,可以采用登记形式,由原型管理器保存对原型对象的引用。在复制一个对象之前,客户端可先查看管理员对象是否已有一个满足要求的原型对象,如果有,则直接从管理员类取得这个对象引用;如果没有,客户端就需要自行复制此原型对象
什么情况下使用原型模式:
1、假设一个系统的产品类是动态加载的,而且产品类具有一定的等级结构。这是如果采取共产那个模式的话,工厂类就不得不具有一个相应的等级结构。而产品类的等级结构一旦变化,工厂类的等级结构就不得不有一个相应对的变化。这对于产品结构可能会有经常性变化的系统来说,采用工厂模式就不太方便。
(1)如果采用原型模式,给每个产品类配备一个克隆方法(大多数的时候只需给产品类等级结构的根类配备一个克隆方法),便可以避免使用工厂模式所带来的具有固定等级结构的工厂类
(2)一个使用原型模式的系统与它的产品对象是怎么创建出来的,这些产品对象之间的结构是怎样的,以及这个结构会不会发生变化是没有关系的。
2、why not use “new”?
如果你有一个对象,有着复杂的状态。你希望得到另一个拷贝,但是同时具有一摸一样的状态,如果选择从头创建一个新的对象,你将不得不重新一个一个地设置这些状态。有的时候有这麻烦,有的时候这不可能做到。这种时候,使用原型模式,调用一个克隆方法,这就变成非常好的方法。
使用原型模式的优点:
1、原型模式允许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此增加新产品对整个结构没有影响。
2、原型模式提供简化的创建结构。工厂方法常需要有一个与产品类相同的的等级结构,而原型模式不需要。
3、具有给一个应用软件加载新功能的能力
4、产品类不需要非得有任何事先确定的等级结构,因为原型模式适用于任何的等级结构。
原型模式的缺点:
1、每一个类必须配备一个克隆方法
2、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环机构的时候。
使用场景:
(1)资源优化场景
(2)性能和安全要求的场景
(3)一个对象多个修改者的场景
Prototype与Abstract Factory往往是相互竞争的,但是他们也可以一起使用。
Abstract Factory可以存储一个被克隆的原型的集合,并且返回产品对象
大量使用的Composite和Decorator模式的设计通常也从Prototype模式处获益
原文地址:http://blog.csdn.net/cool_easy/article/details/45749855