用Java实现的设计模式系列(2)-Prototype

原创 2002年08月19日 16:50:00

      下面的代码实现了原型的最本质功能,即克隆功能。为了完整,我特意加入了原型管理器。这段代码,大部分是来自程序员杂志2001期非鱼的一篇文章,我改正了其中的一些错误而导入到下面的代码之中。
      另外,很多人喜欢用原型来实现工厂模式的功能或者结合工厂模式来使用。为了突出原形的本质功能,所以下面的代码并未加入这些东东。有兴趣的朋友,可以自己找相关的书来看。
       好了,不多说了,代码说明一切,请看代码:

/**
 * Design Pattern In Java
 * Name:Prototype
 * 目的:利用Prototype创建一批同样的产品
 * 原型:PrototypeRam
 * 拷贝:ClonedRam
 * P:Prototype
 * C:Clone
 * Author:blackphoenix
 * Modify Date:2002-08-18
 */
 
import java.util.*;
/**
 * 定义原型产品类 PrototypeRam
 * 此类即后面用来产品大量产品的模板
 */ 

class PrototypeRam implements Cloneable {
 String name;
 public PrototypeRam() {
  name="Hi,I am PrototypeRam!";
 }
 public Object clone() {
  Object o=null;
  try {
   o=super.clone();
  }
  catch(CloneNotSupportedException e) {
   System.err.println("PrototypeRam is not cloneable!");
  }
  return o; 
 }
}

/**
 * 原型管理器,用来方便地对原型进行管理
 * 可以实现自动注册原形的功能
 * 由于原型管理器运行时只要一个实例,所以用单态实现它
 */

class PrototypeManager {
 private static PrototypeManager pm;
 Hashtable prototypes=null;
 private PrototypeManager() {
  prototypes=new Hashtable();
 }
 public static PrototypeManager getManager() {
  if(pm==null) {
   pm=new PrototypeManager();
  }
  return pm;
 }
 public void register(String name,Object prototype) {
  prototypes.put(name,prototype);
 }
 public void unregister(String name) {
  prototypes.remove(name);
 }
 public Object getPrototype(String name) {
  if(prototypes.containsKey(name)) {
   return prototypes.get(name);
  }else {
   Object o=null;
   try {
    /**
     * 自动查找原型管理器里不存在的类,并动态生成它
     */
    o=Class.forName(name).newInstance();
    register(name,o);
   }
   catch(Exception e) {
    System.err.println("Class "+name+"没有定义!");
   }
   return o;
  }
 }  
}
/**
 * 客户端代码,使用PrototypeManager获得原型
 * 通过PrototypeRam生成一批Ram
 */
public class Prototype {
 PrototypeManager pm=null;
 public Prototype() {
  pm=PrototypeManager.getManager();
 }
 public static void main(String[] args) {
  String classname=null;
  classname=args[0];
  Prototype test=new Prototype();
  PrototypeRam pRam=(PrototypeRam)(test.pm.getPrototype(classname));
  if(pRam!=null) {  
   PrototypeRam[] cRam;
   System.out.println("PrototypeRam:  "+pRam.name);
   cRam=new PrototypeRam[10];
   for(int i=0;i<10;i++) {
    /**
     * 生成一批克隆的Ram,并比较他们和原型的不同
     */
    cRam[i]=(PrototypeRam)pRam.clone();
    System.out.println("Cloned Ram"+i+":   "+pRam.name);
   } 
  }else {
   System.err.println("Sorry,can't find the class!");
  }
  
 }

}

附:
 代码经验正可以运行,输入 Java Prototype PrototypeRam即可得正确结果

设计模式(创建型)之原型模式(Prototype Pattern)

要理解原型原型模式必须先理解Java里的浅复制和深复制。有的地方,复制也叫做克隆。Java提供这两种克隆方式。 因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一...
  • yanbober
  • yanbober
  • 2015年04月29日 11:28
  • 3039

设计模式总结之Prototype Pattern(原型模式)

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
  • cooldragon
  • cooldragon
  • 2016年08月11日 00:43
  • 1453

浅谈Java设计模式(五)原型模式(Prototype)

前言: 原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。本小结会通过对象的复制,进行讲解。在...
  • caihongdao123
  • caihongdao123
  • 2016年07月08日 16:41
  • 7741

图解Java多线程设计模式

图解Java多线程设计模式
  • dgutliangxuan
  • dgutliangxuan
  • 2017年09月12日 16:18
  • 1087

23种设计模式及java实现

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模...
  • zmx729618
  • zmx729618
  • 2016年05月27日 14:02
  • 2115

我与C++设计模式(四)——prototype pattern

我故意将bia
  • guozhengdong
  • guozhengdong
  • 2014年10月01日 10:20
  • 497

Java中的设计模式,书籍推荐

本文由 ImportNew - 刘 家财 翻译自 stackoverflow。欢迎加入Java小组。转载请参见文章末尾的要求。 提问:我正在学习GoF的《设计模式》,想了解些它们在实际中的应用的例...
  • napoleonjk
  • napoleonjk
  • 2014年07月31日 09:43
  • 1963

个人对Spring @Scope("prototype")的一些理解

最近忽然想到Spring创建对象的作用域这块儿,之前一直不太了解,不过今天发现,给对象加上@Scope("prototype")pubic Class TestScope,然后引用这个对象并查看其Ha...
  • FlyPisces
  • FlyPisces
  • 2016年05月19日 20:40
  • 972

prototype 是什么东西,原型链的理解,什么时候用 prototype

prototype     prototype是函数对象上面预设的对象属性     1. JS中所有的东西都是对象,每个对象都有prototype这个属性,这个属性是一个对象(object)  ...
  • splendid_can
  • splendid_can
  • 2016年11月26日 14:58
  • 2148

OPENCV学习笔记3-2_用控制器设计模式实现功能模块间通信

在构建更复杂的程序时,需要创建多个算法来协同工作,以实现一些高级功能。要合理地构建程序并让所有的类能互相通信,程序将会变得越来越复杂。因此在一个类中集中对程序进行控制,是非常有益的。这正是控制器设计模...
  • yun_fung
  • yun_fung
  • 2018年01月21日 19:44
  • 22
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Java实现的设计模式系列(2)-Prototype
举报原因:
原因补充:

(最多只允许输入30个字)