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

类别:Java 点击:0 评论:0 推荐:

      下面的代码实现了原型的最本质功能,即克隆功能。为了完整,我特意加入了原型管理器。这段代码,大部分是来自程序员杂志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即可得正确结果

本文地址:http://com.8s8s.com/it/it18215.htm