原始原型模式属于对象创建模式。通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原始模型模式。例如,在西游记中,孙悟空可以揪下一把毫毛,变出多个孙悟空,和他本身几乎一模一样,换言之,孙悟空可以根据自己的形象,复制出很多”身外之身“类,这就相当于采用了原始原型模式。
在Java语言中构件模型直接支持原始模型模式。所有的Javabean都继承自Object,而Object类提供了一个Clone()方法,可以将一个JavaBean对象复制一份。但是,这个JavaBean必须实现了一个标识接口Cloneable,表明这个JavaBean支持复制。
一、原型模式的结构
原型模式中有两种表现方式:第一种是简单形式,第二种是等级形式。这两种表现形式仅仅是原型模式的不同实现。
1、简单形式的原型模式
类图如下:
这种形式涉及到三个角色:
①客户角色:客户类提出创建对象请求;
②抽象原型角色:这是一个抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有的具体原型类所需的接口。
③具体原型角色:被复制的对象,此角色需要实现抽象的原型角色所要求的接口。
实例代码:
//在抽象原型角色声明了一个Clone()方法 public interface Prototype extends Cloneable{ Prototype clone(); } //具体原型角色实现clone()方法 public class ConcreatePrototype implements Prototype{ /** * 克隆方法,实现原型模式的实现 **/ public Object clone(){ try{ return super.clone(); }catch(CloneNotSupportedException e){ return null; } } } public class Client{ private Prototype prototype; public void operation(Prototype example){ Prototype p = (Prototype)example.clone(); } }
2、登记形式的原始模型模式
类图如下:
作为原型模式的第二种形式,他有如下的角色:
①客户端角色:客户端类向管理员提出创建对象的请求;
②抽象原型角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。
③具体原型角色:被复制的对象。需要实现抽象的原型角色所要求的接口;
④原型管理器角色:创建具体原型类的对象,并记录每一个被创建的对象。
实例代码:
//抽象原型角色,声明clone方法 public interface Prototype extends Cloneable{ public Object clone(); } //具体原型角色,实现抽象原型角色声明的方法 public class ConcreatePrototype implements Prototype{ //克隆方法 public synchronized Object clone(){ Prototype temp = nulll; try{ temp = (Prototype)super.clone(); return temp; }catch(CloneNotSupportedException e){ System.out.println("Clone failed"); }finally{ return temp; } } }
下面是原型管理器角色,保持一个聚集,作为对所有原型对象的等级,这个角色提供必要的方法,供外界增加新的原型对象和取得已经登记过的原型对象。代码如下:
public 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(); } }
//客户端角色类 public class Client{ private PrototypeManager mgr; private Prototype prototype; public void registerPrototype(){ prototype = new ConcreatePrototype(); Prototype copytype = (Prototype)prototype.clone(); mgr.add(copytype); } }
两种方式的比较:如果需要创建的原型对象数目较少而且比较固定的话,可以采用第一种方式。在这种情况下,原型对象的引用有客户端自己保存;如果要创建的原型对象数目不固定,可以采用第二种形式。在这种情况下,客户端并不保存对原型对象的引用,这个任务交给管理员对象。如果有,可以直接从管理员对象类取得这个对象的引用,如果没有,客户端就需要自行复制词原型对象。
注意:在模式的实现过程中,设计到对象的深复制和浅复制的问题,有关这个问题,请查看前面《java传值、传址以及对象的clone》一章节。
二、什么情况下使用原型模式(Prototype)
建设一个系统产品类是动态加载的,而且产品类具有一定的等级结构。这个时候如果采用工厂模式的话,工厂类就不得不具有一个相应的等级结构。而产品类的等级结构一旦变化,工厂类的等级结构就不得不有一个相应的变化。这对于产品结构可能会有经常性的变化的系统来说,采用工厂模式就有不方便之处。
这时如果采取原始原型模式,给每一个产品类配备一个克隆方法,便可以避免使用工厂模式所带来的具有固定等级结构的工厂类。这样,一个使用了原始原型模式的系统与他的产品对象是怎么创建出来的,以及这些产品对象之间的结构是怎样的,以及这个结构会不会发生变化是没有关系的。
三、原型模式的优缺点
优点:①原型模式允许动态的增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此,增加新产品对整个结构没有影响;
②原型模式提供简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,而原型模式就不需要这样。
③具有给一个应用软件动态加载新功能的能力。例如:一个分析web服务器的记录文件的应用软件,这对每一种记录文件格式,都可以由一个相应的“格式类”负责。如果出现了应用软件不支持的新的web服务器,只需要体统一个格式类的克隆,并在客户端登记即可,而不必给每个软件的用户提供一个全新的软件包。
④产品类不需要非得有任何事先确定的等级结构,因为原型模式适用于任何的等级结构。
缺点:原型模式中每一个类都必须配备一个克隆方法。配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类来说并不是很难,而对于已经有的类不一定很容易,特别是当一个类引用不支持串行化的间接对象,或引用含有循环结构的时候。
相关推荐
Java与模式.清晰.rar 第一部分 第1章 模式的简史和形而上学 第2章 统一建模语言UML简介 ...第20章 原始模型(Prototype)模式 第21章 专题:JavaBean的“冷藏”和“解冻” 第四部分 第22章 适配器(Adapter)模式[1]
4. **原始模型模式(Prototype模式)**: 原始模型模式通过克隆一个已有对象来创建新对象,避免重复编写相同代码。比如,收集一些肉麻情话,需要时直接复制使用。这种模式适用于需要频繁创建相似对象的情况,但每个...
4. 原始模型模式(Prototype Pattern) 原始模型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不...
17. 原始模型模式(Prototype) 原始模型模式用原型实例指定创建对象的种类,并且通过拷贝这个原型创建新的对象。这种模式使得对象创建可以灵活地变化。 18. 代理模式(Proxy) 代理模式为其他对象提供一个代理以...
4. 原始模型模式(Prototype): 原始模型模式是通过克隆已有对象来创建新对象的设计模式。它提供了一种通过复制现有的对象来创建新对象的方式,减少了创建新对象的复杂度,尤其适用于对象创建成本较高的情况。原始...
Prototype 原始模型模式 原始模型模式是一种基于已存在的实例创建新实例的方式,通过复制一个现有实例来生成新的实例,而无需知道其具体实现细节。例如,在即时通讯软件中,可以通过复制预先设置好的情话模板,...
4. 原始模型模式(Prototype模式):原始模型模式允许通过复制原型对象来创建新对象,提供了动态地增加或减少产品类的能力,且无需关心产品的具体实现细节。 5. 单例模式:单例模式保证一个类只有一个实例,并提供...
4. 原始模型模式(Prototype): 原始模型模式通过克隆已有对象来创建新对象,简化了对象的创建过程。客户端可以要求一个原型对象克隆自身,以得到与原型相同或相似的新对象,而无需知道具体实现细节。 5. 单例...
com.javapatterns.prototype 原始模型模式 com.javapatterns.proxy 代理模式 com.javapatterns.proxy.smartproxy 专题:智能引用代理 com.javapatterns.proxy.imageloader 专题:虚拟代理的例子 ...
4. 原始模型模式(Prototype Pattern): 原型模式也属于创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化新的类。这种方法可以提高性能,特别是在创建对象非常耗时或者需要大量初始化工作时。 ...
- **原始模型模式(Prototype模式)**:原型模式通过复制已有对象来创建新对象,避免了直接构造新对象的复杂性。比如,收集一些情话并复制到聊天软件中,就可以快速发送给不同的对象。 - **单例模式**:单例模式...
4. 原始模型模式(Prototype模式):该模式通过复制原型对象来创建新对象,允许动态地增加或减少产品类,适用于没有预定义等级结构的产品类集合。 5. 单例模式:单例模式确保一个类只有一个实例,并提供全局访问点...
<br>第一部份、UML和模式介绍 com.javapatterns.uml 统一建模语言UML介绍... com.javapatterns.prototype 原始模型模式 com.javapatterns.serializable 专题:JavaBean的“冷藏”和“解冻”
4. 原始模型模式(Prototype):原型模式是另一种创建型模式,它通过克隆现有的对象来创建新的对象。这种方法减少了创建新对象的开销,特别是当对象创建过程复杂时。原型模式允许动态地增加或减少产品类,对产品类的...
原始模型模式: 原始模型模式 通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原 型对象的方法创建出更多同类型的对象。 原始模型模式允许动态的增加或减少产品类, 产品 类不需要非得有任何事先...
1.1.4. Prototype—原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。例如,我搜集了好多肉麻的情话,可以用来和MM聊天。 1.1.5. Singleton—...
4. 原始模型模式(Prototype):原型模式通过复制已有对象创建新对象,减少了创建新对象的成本。如例子中,将肉麻情话保存为原型,需要时直接复制到聊天工具中。 5. 单例模式(Singleton):单例模式确保一个类只有...
- 原始模型模式(Prototype):通过复制已有对象来创建新对象,避免了重复的初始化过程。 - 单例模式:保证一个类只有一个实例,并提供全局访问点,通常用于管理共享资源或全局配置。 2. 结构模式:关注如何组织...
Java原型模型(Prototype)是设计模式中的一种,主要用于对象的克隆操作,它允许我们创建对象的副本,而无需知道具体实现的细节。这个模式基于Java语言中的`Cloneable`接口和`clone()`方法,使得我们可以高效地复制...
7. **原始模型模式(Prototype)**:通过克隆原型对象来创建新对象,简化了对象的创建过程。原始模型模式适用于需要频繁创建相似对象的情况,但要求所有类都实现克隆接口。 8. **代理模式(Proxy)**:为其他对象...