`
student_lp
  • 浏览: 435542 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

     原始原型模式属于对象创建模式。通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原始模型模式。例如,在西游记中,孙悟空可以揪下一把毫毛,变出多个孙悟空,和他本身几乎一模一样,换言之,孙悟空可以根据自己的形象,复制出很多”身外之身“类,这就相当于采用了原始原型模式。

     在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服务器,只需要体统一个格式类的克隆,并在客户端登记即可,而不必给每个软件的用户提供一个全新的软件包。

④产品类不需要非得有任何事先确定的等级结构,因为原型模式适用于任何的等级结构。

缺点:原型模式中每一个类都必须配备一个克隆方法。配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类来说并不是很难,而对于已经有的类不一定很容易,特别是当一个类引用不支持串行化的间接对象,或引用含有循环结构的时候。

  • 大小: 30.6 KB
  • 大小: 30.2 KB
分享到:
评论

相关推荐

    Java与模式.清晰.rar

    Java与模式.清晰.rar 第一部分 第1章 模式的简史和形而上学 第2章 统一建模语言UML简介 ...第20章 原始模型(Prototype)模式 第21章 专题:JavaBean的“冷藏”和“解冻” 第四部分 第22章 适配器(Adapter)模式[1]

    关于-23种设计模式的有趣见解.doc

    4. **原始模型模式(Prototype模式)**: 原始模型模式通过克隆一个已有对象来创建新对象,避免重复编写相同代码。比如,收集一些肉麻情话,需要时直接复制使用。这种模式适用于需要频繁创建相似对象的情况,但每个...

    OO中对于23种设计模式的整理

    4. 原始模型模式(Prototype Pattern) 原始模型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不...

    Java中23种设计模式详解

    17. 原始模型模式(Prototype) 原始模型模式用原型实例指定创建对象的种类,并且通过拷贝这个原型创建新的对象。这种模式使得对象创建可以灵活地变化。 18. 代理模式(Proxy) 代理模式为其他对象提供一个代理以...

    设计模式

    4. 原始模型模式(Prototype): 原始模型模式是通过克隆已有对象来创建新对象的设计模式。它提供了一种通过复制现有的对象来创建新对象的方式,减少了创建新对象的复杂度,尤其适用于对象创建成本较高的情况。原始...

    23种JAVA设计模式和15种J2EE设计模式

    Prototype 原始模型模式 原始模型模式是一种基于已存在的实例创建新实例的方式,通过复制一个现有实例来生成新的实例,而无需知道其具体实现细节。例如,在即时通讯软件中,可以通过复制预先设置好的情话模板,...

    Java的23种设计模式.pdf

    4. 原始模型模式(Prototype模式):原始模型模式允许通过复制原型对象来创建新对象,提供了动态地增加或减少产品类的能力,且无需关心产品的具体实现细节。 5. 单例模式:单例模式保证一个类只有一个实例,并提供...

    关于-设计模式的经典文章.doc

    4. 原始模型模式(Prototype): 原始模型模式通过克隆已有对象来创建新对象,简化了对象的创建过程。客户端可以要求一个原型对象克隆自身,以得到与原型相同或相似的新对象,而无需知道具体实现细节。 5. 单例...

    源码:阎宏设计模式光盘

    com.javapatterns.prototype 原始模型模式 com.javapatterns.proxy 代理模式 com.javapatterns.proxy.smartproxy 专题:智能引用代理 com.javapatterns.proxy.imageloader 专题:虚拟代理的例子 ...

    JAVA常用设计模式详解大全.doc

    4. 原始模型模式(Prototype Pattern): 原型模式也属于创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化新的类。这种方法可以提高性能,特别是在创建对象非常耗时或者需要大量初始化工作时。 ...

    JAVA设计模式与J2EE设计模式.doc

    - **原始模型模式(Prototype模式)**:原型模式通过复制已有对象来创建新对象,避免了直接构造新对象的复杂性。比如,收集一些情话并复制到聊天软件中,就可以快速发送给不同的对象。 - **单例模式**:单例模式...

    java23种设计模式

    4. 原始模型模式(Prototype模式):该模式通过复制原型对象来创建新对象,允许动态地增加或减少产品类,适用于没有预定义等级结构的产品类集合。 5. 单例模式:单例模式确保一个类只有一个实例,并提供全局访问点...

    JAVA与模式

    <br>第一部份、UML和模式介绍 com.javapatterns.uml 统一建模语言UML介绍... com.javapatterns.prototype 原始模型模式 com.javapatterns.serializable 专题:JavaBean的“冷藏”和“解冻”

    设计模式(形象比喻快速入门).doc

    4. 原始模型模式(Prototype):原型模式是另一种创建型模式,它通过克隆现有的对象来创建新的对象。这种方法减少了创建新对象的开销,特别是当对象创建过程复杂时。原型模式允许动态地增加或减少产品类,对产品类的...

    C#23种设计模式_示例源代码及PDF

    原始模型模式: 原始模型模式 通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原 型对象的方法创建出更多同类型的对象。 原始模型模式允许动态的增加或减少产品类, 产品 类不需要非得有任何事先...

    23种JAVA设计模式和15种J2EE设计模式.docx

    1.1.4. Prototype—原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。例如,我搜集了好多肉麻的情话,可以用来和MM聊天。 1.1.5. Singleton—...

    经典:从追MM谈Java的23种设计模式

    4. 原始模型模式(Prototype):原型模式通过复制已有对象创建新对象,减少了创建新对象的成本。如例子中,将肉麻情话保存为原型,需要时直接复制到聊天工具中。 5. 单例模式(Singleton):单例模式确保一个类只有...

    JAVA常用设计模式详解大全

    - 原始模型模式(Prototype):通过复制已有对象来创建新对象,避免了重复的初始化过程。 - 单例模式:保证一个类只有一个实例,并提供全局访问点,通常用于管理共享资源或全局配置。 2. 结构模式:关注如何组织...

    java原型模型

    Java原型模型(Prototype)是设计模式中的一种,主要用于对象的克隆操作,它允许我们创建对象的副本,而无需知道具体实现的细节。这个模式基于Java语言中的`Cloneable`接口和`clone()`方法,使得我们可以高效地复制...

    UML类图的简介

    7. **原始模型模式(Prototype)**:通过克隆原型对象来创建新对象,简化了对象的创建过程。原始模型模式适用于需要频繁创建相似对象的情况,但要求所有类都实现克隆接口。 8. **代理模式(Proxy)**:为其他对象...

Global site tag (gtag.js) - Google Analytics