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

|