`
blues1021
  • 浏览: 139825 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

Prototype原型模型-java设计模式5

 
阅读更多

  一、概念:Prototype原型模式 通过复制一个或多个原型类,然后修改或填充具体的内容获得目标类的方式。 如果目标类与原型类相似或者他们本身就属于一个类型组(特别是来自一个数据集合对象),则可以使用原型模式。

二、示例 :游泳比赛选手列表小程序,先创建一个TimeSwimData类的列表的Vector对象,然后从中复制修改填充AgeSwimData类、SexSwimData类对象的Vector值,从而得到所需的不同的对象。

它的UML 类图为:

三、程序解析:

1.在程序主类SwimInfo类中声明了SwimData类,Swimmer类对象,引用了SwimData的子类 ,在其构造方法中:

public SwimInfo()
   {
    super("Prototype example");
    sdata = new TimeSwimData("d:/swimmers.txt");
    setGUI();
    loadswList(sdata, swList);
   }
 

 在TimeSwimmData构造方法中:

public TimeSwimData(String filename)
   {
      String s = "";
      swimmers = new Vector();  
      InputFile f = new InputFile(filename);
      s= f.readLine();
      while (s != null) {
         swimmers.addElement(new Swimmer(s));
         s= f.readLine();
      }
      f.close();
   }
 

 2.在共同的SwimData抽象类中声明的重要的deepClone()方法 ,使得子类中可以调用它得到独立的TimeSwimmData类的Vector数据。

public SwimData deepClone()
   {
      try {
         ByteArrayOutputStream b = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(b);

   out.writeObject(this);//对当前的对象做了流复制,使得当前的对象改变了。
ByteArrayInputStreambIn=newByteArrayInputStream(b.toByteArray());
      ObjectInputStream oi = new ObjectInputStream(bIn);

         return((SwimData)oi.readObject());
      }
      catch (Exception e) {
         System.out.println("exception:"+e.getMessage());
         e.printStackTrace();
         return null;
      }
}

 


3.子类中使用对得到的Vector数据做了排序(修改)得到新的Vector数据使得它的对象拥有了新的特征。 例如SexSwimData类先用构造方法获得了上述深拷贝的对象,然后用sort()方法得到了新的对象:

构造方法,其中的sd参数是TimeSwimData创建的对象:

public SexSwimData(SwimData sd) {
     swimdata=sd.deepClone ();
//获得了流深拷贝后的对象。
 female = true;
   }

 

  sort()方法:

public void sort() {
      sexData = new Vector();
//在对象外调用,使得对象的Vector属性保持这里的改变值
  for (int i=0; i<swimdata.size (); i++) {
         Swimmer sw = swimdata.getSwimmer (i);
         if (sw.isFemale () == female ) {
            sexData.addElement (sw);
         }
      }
   }   



 

 从而得到了基于改变原对象Vector数据的SexSwimData类对象,实现了原型模式。


扩展: 1.拷贝的形式,上述的使用ByteArrayOutputStream类的方法是对于原型类的数据比较复杂的情况下很有效的方法。当然也可以用重新声明一个数组或向量将其用原来的数据一个个的取出赋值给它,然后将其放到目标类的构造方法中实现深拷贝(这也是复制的数据成员较简单时常用的方法),如在SwimData中没有实现相应的方法,则在子类TimeSwimData类中用这样的构造方法实现对自己的拷贝,以提供给其他的子类调用它的构造方法创建独立的Vector:

 public TimeSwimData(Vector sw) {
        //this constructor copies vector as clone
        swimmers  = new Vector();
        for (int i=0; i < sw.size (); i++) {
            swimmers.add (sw.elementAt (i));
        }
    }

 

 2.以上的生成相应的类的决策点是在用户单击相应的按钮时,决策点可以是一个类注册表或是原型管理器,管理有类似独立数据成员的子类(也可是管理多个对象组),它查看这些特征数据(可在运行时)并选择创建最合适的类,这是结合了Builder模式。

3.可以和工厂模式结合,使得每个具体类与其他的可用的具体类完全不同。

四、结论:

(1)在运行时可以根据需要,以复制的方式增加和删除类。

(2)可以基于程序条件,在运行时修改一个类的内部数据表示。

(3)可以在运行时指定新的对象,而无需创建一系列类和继承结构。

分享到:
评论

相关推荐

    JAVA21种设计模式

    **Java的21种设计模式概述** 在软件开发中,设计模式是一种被广泛接受的解决方案,用于解决常见的设计问题。这些模式是经验丰富的开发者在实践中总结出来的,它们为复杂问题提供了一种标准化的方法。Java的21种设计...

    java面试——深圳-乐信-Java高级.zip

    在Java高级面试中,面试官通常会关注候选人在核心Java、多线程、集合框架、JVM内存管理、设计模式、数据库操作、网络编程、异常处理、IO流、Spring框架及其实现原理等方面的知识掌握程度。以下是根据这些关键点展开...

    java原型模型

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

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

    Java设计模式和J2EE设计模式是提升代码质量、可维护性和复用性的重要工具。这里我们将详细探讨标题所提及的23种Java设计模式和15种J2EE设计模式。 首先,Java设计模式分为三大类:创建型、结构型和行为型模式。创建...

    java设计模式和30种java架构图.zip

    Java设计模式和架构图是软件开发中的重要概念,它们对于构建高效、可维护的系统至关重要。设计模式是解决常见编程问题的经验总结,而架构图则是系统结构的可视化表示,帮助我们理解和规划系统的整体布局。 首先,...

    Java设计模式(疯狂Java联盟版)

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可重用性、可维护性和灵活性。本资源“Java设计模式(疯狂Java联盟版)”提供了对这一主题的深入解析,适用于正在学习...

    Java中23种设计模式详解

    Java 中 23 种设计模式详解 在软件设计中,设计模式是解决特定问题的通用解决方案。 Java 中有 23 种常见的设计模式,下面将对每种设计模式进行详细的解释: 1. 抽象工厂模式(Abstract Factory) 抽象工厂模式...

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

    JAVA设计模式和J2EE设计模式 JAVA设计模式是软件开发中一种常见的设计模式,用于解决软件设计中的一些常见问题。JAVA设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。下面是对每种模式的详细介绍: ...

    Java设计模式——原型模式

    原型模式Java设计模式——原型模式概念使用场景Java里的克隆代码理解prototype(原型)问题总结优缺点模型优点模型缺点 概念 ​ 原型模式是创建型模式的最后一种,讲到原型模式就不得不提到克隆这个词,克隆这个词...

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

    Java设计模式是面向对象编程中的重要概念,它们是解决常见软件设计问题的模板,提供了可重用的解决方案。本文主要探讨了两种类型的模式:创建型模式和结构型模式。 1. **创建型模式**: - **抽象工厂模式**:抽象...

    JAVA设计模式

    Java设计模式是软件工程中的一种最佳实践,它提供了一种在特定情况下解决常见问题的模板。这些模式基于经验丰富的开发者们在过去项目中的成功经验,经过提炼和总结,成为了可复用的设计策略。Java设计模式主要分为...

    J2EE相关设计模式23种Java设计模式

    Java设计模式是软件开发中的重要概念,特别是在J2EE企业级应用开发中,它们提供了一套标准的方法来解决常见的设计问题,提高了代码的可重用性、可维护性和可扩展性。以下是关于J23种Java设计模式的一些关键知识点: ...

    Java设计模式 图解 附代码

    ### Java设计模式详解 #### 一、概述 Java设计模式是一种在特定场景下解决软件设计问题的方法论。设计模式能够帮助开发者在面对复杂问题时,采用经过验证的解决方案。通过学习设计模式,开发者不仅能提高代码的可...

    java设计模式

    Java设计模式是软件开发中的一种最佳实践,它总结了在特定场景下,为解决常见问题而形成的一套可复用的解决方案。设计模式并不直接提供代码实现,而是提供了一种通用的语言,使得开发者能够更有效地沟通和理解彼此的...

    java23种设计模式

    Java的23种设计模式是软件工程中的一种经典思想,它们是解决常见编程问题的通用解决方案,被广泛应用于各种复杂的软件开发中。这些模式源于GoF(Gang of Four)的著作《设计模式:可复用面向对象软件的基础》,旨在...

    design+patterns+java.rar

    这个名为"design+patterns+java.rar"的压缩包很可能包含了一本关于使用Java实现设计模式的电子书,文件名"design+patterns+java.pdf"暗示了这一点。下面将深入探讨设计模式以及它们在Java编程中的应用。 设计模式...

    23种设计模式JAVA实现,例子通俗易懂

    5. **原型模式(Prototype)**:通过复制已有对象来创建新对象,减少了类的实例化次数,提高性能。适用于需要大量创建相似对象的情况。 6. **组合模式(Composite)**:将对象组织成树形结构,可以对单个对象和组合...

    java 设计模式

    Java设计模式是面向对象编程中的最佳实践,它们是解决常见问题的经验总结,为软件开发提供了一种可重用的解决方案。在Java开发中,熟练掌握设计模式能够提高代码的可读性、可维护性和可扩展性。以下是Java设计模式的...

Global site tag (gtag.js) - Google Analytics