My FAQ,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > JavaDelphi
用Java实现的设计模式系列(2)-Prototype
作者:blackphoenix 时间:2001-11-20 11:11 出处:互联网 责编:MyFAQ
              摘要:用Java实现的设计模式系列(2)-Prototype

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有