原始模型模式
2013-07-27 18:34
225 查看
通过原型对象来指明要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。
原始模型模式有两种表现形式:
第一种是简单形式
这种形式涉及三个角色:
1.客户角色(Client):客户类提出创建对象的请求
2.抽象原型角色(Prototype):抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有具体原型所需的接口
3.具体原型(Concrete Prototype):被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
第二种是登记形式
它有如下角色:
1.客户端(Client)角色:客户端类向管理员提出创建对象的请求
2.抽象原型(Prototype)角色:通常由一个接口或抽象实现。此角色给出所有具体原型类所需要的接口
3.具体原型角色(Concrete Prototype):被复制的对象。需要实现抽象的原型角色所要求的接口
4.原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对象。
这两种形式各有长短处:
如果需要创建的原型对象数目较少而且比较固定的话,可以采取第一种形式,也即简单形式的原始模式。在这种情况下,原型对象的引用可以由客户端自己保存。
如果要创建的原型对象数目不固定的话,可以采取第二种形式,也即登记形式的原始模型模式。在这种情况下,客户端并不保存以原型的引用,这个任务交给管理员对象。在复制一个原型对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象。如果有,可以直接从管理员类取得这个对象的引用;如果没有,客户端就需要自行复制些原型对象。
什么情况下使用原型模式:
假设一个系统的产品类是动态加载的,而且产品类具有一定的等级结构。这个时候如果采取工厂模式的话,工厂类就不得不具有一个相应的等级结构。而产品类的等级结构一旦变化,工厂类的等级结构就不得不有一个相应的变化。这对于产品结构可能会有经常性变化系统来说,采用工厂模式就有不便之处。这时如果采取原始模型模式,给每一个产品类配备一个克隆方法(大多数时候只需要给产品等级结构的根类配备一个克隆方法),便可以避免使用工厂模式所带来的具有固定等级结构的工厂类。
原型模式的优缺点:
抽象工厂模式有许多与原始模型模式和建造模式相同的效果,包括客户端不知道具体产品类,而只知道抽象产品类,客户端不需要知道这么多的具体产品名称。如果有新的产品类加入,客户端不需要进行改造就可以直接使用。
原始模型模式有其特有的优点:
1.原始模型模式允许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此,增加新产品对整个结构没有影响
2.原始模型模式提供简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,而原始模型模式就不需要这样。对于java来说,原始模型模式又有其特有的方便之处,因为java语言天生就将原始模型模式设计到了语言模型里。善于利用原始模型模式和java语言的特点,可以事半功倍。
3.具有给一个应用软件动态加载新功能的能力。如一个分析web服务器的记录文件的应用 软件,针对每一种记录文件格式,都可以由一个相就的“格式类”负责。如果出现了应用软件所不支持的新的web服务器,只需要提供一个格式类的克隆,并在客户端登记即可,而不必给每个软件的用户提供一个全新的软件包。
4.产品类不需要非得有任何事先确定的等级结构,因为原始模型模式适用于任何的等级结构。
原始模型模式最主要的缺点就是每一个类都必须配备一个克隆方法。配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类来说不是很难,而对于已经有的类不一定很容易,特别是当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
另外在深复制中,什么样的类不适合串行化?
一般满足下面4个条件中一个就不应当串行化:
1.一个类与本地代码有紧密的关系
2.对象的内部状态依赖于Java虚拟机或运行环境,从而在每一次运行时这个状态都有可能不同。如java.lang.Thread,java.io.InputStream.java.io.FileDescriptor.
3.串行化可能带来潜在的安全隐患。如java.lang.SecurityManager
4.一个类仅仅是一些静态方法的存放地,并没有任何的内部状态。如java.lang.Math
原始模型模式有两种表现形式:
第一种是简单形式
这种形式涉及三个角色:
1.客户角色(Client):客户类提出创建对象的请求
2.抽象原型角色(Prototype):抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有具体原型所需的接口
3.具体原型(Concrete Prototype):被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
//客户端 public class Client { private Prototype prototype; public void operation(Prototype example) { Prototype p =(Prototype)example.clone(); } } //抽象原型 interface Prototype extends Cloneable{ public Object clone(); } class ConcretePrototype implements Prototype{ public Object clone(){ try{ return super.clone(); }catch (CloneNotSupportedException e) { return null; } } }
第二种是登记形式
它有如下角色:
1.客户端(Client)角色:客户端类向管理员提出创建对象的请求
2.抽象原型(Prototype)角色:通常由一个接口或抽象实现。此角色给出所有具体原型类所需要的接口
3.具体原型角色(Concrete Prototype):被复制的对象。需要实现抽象的原型角色所要求的接口
4.原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对象。
public class Client2 { private PrototypeManager mgr; private Prototype prototype; public void registerPrototype(){ prototype = new ConcretePrototype(); Prototype copytype = (Prototype)prototype.clone(); mgr.add(copytype); } } //抽象原型角色 interface Prototype extends Cloneable{ public Object clone(); } class ConcretePrototype implements Prototype{ public synchronized Object clone(){ Prototype temp = null; try{ temp = (Prototype)super.clone(); return temp; }catch(CloneNotSupportedException e){ System.out.println("Clone failed"); }finally{ return temp; } } } class PrototypeManager{ private Vector objects = new Vector(); //增加一个新的对象 public void add(Prototype object){ objects.add(object); } //取出一个对象 public Prototype get(int i){ return (Prototype)objects.get(i); } //取出集合的大小 public int getSize(){ return objects.size(); } }
这两种形式各有长短处:
如果需要创建的原型对象数目较少而且比较固定的话,可以采取第一种形式,也即简单形式的原始模式。在这种情况下,原型对象的引用可以由客户端自己保存。
如果要创建的原型对象数目不固定的话,可以采取第二种形式,也即登记形式的原始模型模式。在这种情况下,客户端并不保存以原型的引用,这个任务交给管理员对象。在复制一个原型对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象。如果有,可以直接从管理员类取得这个对象的引用;如果没有,客户端就需要自行复制些原型对象。
什么情况下使用原型模式:
假设一个系统的产品类是动态加载的,而且产品类具有一定的等级结构。这个时候如果采取工厂模式的话,工厂类就不得不具有一个相应的等级结构。而产品类的等级结构一旦变化,工厂类的等级结构就不得不有一个相应的变化。这对于产品结构可能会有经常性变化系统来说,采用工厂模式就有不便之处。这时如果采取原始模型模式,给每一个产品类配备一个克隆方法(大多数时候只需要给产品等级结构的根类配备一个克隆方法),便可以避免使用工厂模式所带来的具有固定等级结构的工厂类。
原型模式的优缺点:
抽象工厂模式有许多与原始模型模式和建造模式相同的效果,包括客户端不知道具体产品类,而只知道抽象产品类,客户端不需要知道这么多的具体产品名称。如果有新的产品类加入,客户端不需要进行改造就可以直接使用。
原始模型模式有其特有的优点:
1.原始模型模式允许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此,增加新产品对整个结构没有影响
2.原始模型模式提供简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,而原始模型模式就不需要这样。对于java来说,原始模型模式又有其特有的方便之处,因为java语言天生就将原始模型模式设计到了语言模型里。善于利用原始模型模式和java语言的特点,可以事半功倍。
3.具有给一个应用软件动态加载新功能的能力。如一个分析web服务器的记录文件的应用 软件,针对每一种记录文件格式,都可以由一个相就的“格式类”负责。如果出现了应用软件所不支持的新的web服务器,只需要提供一个格式类的克隆,并在客户端登记即可,而不必给每个软件的用户提供一个全新的软件包。
4.产品类不需要非得有任何事先确定的等级结构,因为原始模型模式适用于任何的等级结构。
原始模型模式最主要的缺点就是每一个类都必须配备一个克隆方法。配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类来说不是很难,而对于已经有的类不一定很容易,特别是当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
另外在深复制中,什么样的类不适合串行化?
一般满足下面4个条件中一个就不应当串行化:
1.一个类与本地代码有紧密的关系
2.对象的内部状态依赖于Java虚拟机或运行环境,从而在每一次运行时这个状态都有可能不同。如java.lang.Thread,java.io.InputStream.java.io.FileDescriptor.
3.串行化可能带来潜在的安全隐患。如java.lang.SecurityManager
4.一个类仅仅是一些静态方法的存放地,并没有任何的内部状态。如java.lang.Math
相关文章推荐
- 原始模型模式
- 浅谈 java 设计模式--原始模型模式(Prototype pattern)
- 《Java与模式》学习笔记之八---原始模型模式(Prototype Pattern)
- 实例探索Java模式之路——原始模型
- 《java与模式》学习系列——原始模型模式
- java设计模式--原始模型模式
- 原始模型(Prototype)模式学习笔记
- Java 模式2(创建模式) - 建造模式,原始模型,JavaBean 的冷藏和解冻
- 七、原型模式(原始模型模式)protoType
- 原始(prototype)模型模式之简单形式与登记形式
- java的原始模型(Prototype)模式(一) 基本原理
- 《Java与模式》选读“原始模型(Prototype)模式”
- 原始模型模式
- 《java与模式》-10 原始模型模式
- (C++设计模式) ------原始模型模式 Prototype -- 创建型模式
- 设计模式之原始模型模式
- 原始模型模式
- Java---彩票双色球原始模型实现
- Java NIO 与 基于reactor设计模式的事件处理模型
- 浏览器渲染模式与盒模型的计算方法(doctype,DTD)