码迷,mamicode.com
首页 > 其他好文 > 详细

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

时间:2015-05-25 11:28:23      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:设计模式   java   

 菜鸟学设计模式系列笔记之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模式处获益

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

标签:设计模式   java   

原文地址:http://blog.csdn.net/cool_easy/article/details/45749855

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!