(参考:http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.html)
在这种情况下,客户端不保存对原型对象的引用,这个任务被交给管理员对象。在复制一个原型对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象。如果有,可以直接从管理员类取得这个对象引用;如果没有,客户端就需要自行复制此原型对象。
/** * Project Name:DesignPatterns * File Name:Prototype.java * Package Name:com.louis.clone.Manager * Date:2017年9月27日上午9:08:05 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.clone.Manager; /** * ClassName:Prototype * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年9月27日 上午9:08:05 * @author michael * @version * @since JDK 1.7 * @see */ public interface Prototype { public Prototype clone(); public String getName(); public void setName(String name); }
/** * Project Name:DesignPatterns * File Name:ConcretePrototype1.java * Package Name:com.louis.clone.Manager * Date:2017年9月27日上午9:09:49 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.clone.Manager; /** * ClassName:ConcretePrototype1 * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年9月27日 上午9:09:49 * @author michael * @version * @since JDK 1.7 * @see */ public class ConcretePrototype1 implements Prototype { String name; public Prototype clone(){ ConcretePrototype1 concretePrototype1 = new ConcretePrototype1(); concretePrototype1.setName(this.name); return concretePrototype1; } /** * TODO 简单描述该方法的实现功能(可选). * @see com.louis.clone.Manager.Prototype#getName() */ @Override public String getName() { // TODO Auto-generated method stub return name; } /** * TODO 简单描述该方法的实现功能(可选). * @see com.louis.clone.Manager.Prototype#setName(java.lang.String) */ @Override public void setName(String name) { // TODO Auto-generated method stub this.name = name; } public String toString() { return "Now in Prototype1 , name = " + this.name; } }
/** * Project Name:DesignPatterns * File Name:ConcretePrototype1.java * Package Name:com.louis.clone.Manager * Date:2017年9月27日上午9:09:49 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.clone.Manager; /** * ClassName:ConcretePrototype1 * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年9月27日 上午9:09:49 * @author michael * @version * @since JDK 1.7 * @see */ public class ConcretePrototype2 implements Prototype { String name; public Prototype clone(){ ConcretePrototype2 concretePrototype2 = new ConcretePrototype2(); concretePrototype2.setName(this.name); return concretePrototype2; } /** * TODO 简单描述该方法的实现功能(可选). * @see com.louis.clone.Manager.Prototype#getName() */ @Override public String getName() { // TODO Auto-generated method stub return name; } /** * TODO 简单描述该方法的实现功能(可选). * @see com.louis.clone.Manager.Prototype#setName(java.lang.String) */ @Override public void setName(String name) { // TODO Auto-generated method stub this.name = name; } public String toString() { return "Now in Prototype2 , name = " + this.name; } }
/** * Project Name:DesignPatterns * File Name:PrototypeManager.java * Package Name:com.louis.clone.Manager * Date:2017年9月27日上午9:13:39 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.clone.Manager; import java.util.HashMap; import java.util.Map; import org.omg.PortableServer.POA; /** * ClassName:PrototypeManager * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年9月27日 上午9:13:39 * @author michael * @version * @since JDK 1.7 * @see */ public class PrototypeManager { /* * 用来记录原型的编号和原型实例的对应关系 * */ private static Map<String, Prototype> map = new HashMap<String,Prototype>(); /* * 私有构造方法,防止外部创建实例 * */ private PrototypeManager(){} /* * 向原型管理器里面添加或修改某个原型的注册 * */ public synchronized static void setPrototype(String prototypeId,Prototype prototype){ map.put(prototypeId, prototype); } /* * 从原型管理器里面删除某个原型注册 * */ public synchronized static void removePrototype(String prototypeId){ map.remove(prototypeId); } /* * 获取某个原型编号对应的原型实例 * */ public synchronized static Prototype getPrototype(String prototypeId) throws Exception{ Prototype prototype = map.get(prototypeId); if(prototype == null){ throw new Exception("您希望获取的原型还没有注册或已被销毁"); } return prototype; } }
/** * Project Name:DesignPatterns * File Name:Client.java * Package Name:com.louis.clone.Manager * Date:2017年9月27日上午9:23:05 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.clone.Manager; /** * ClassName:Client * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年9月27日 上午9:23:05 * @author michael * @version * @since JDK 1.7 * @see */ public class Client { public static void main(String[] args) { Prototype p1 = new ConcretePrototype1(); PrototypeManager.setPrototype("p1", p1); //获取原型来创建 Prototype p3; try { p3 = PrototypeManager.getPrototype("p1").clone(); p3.setName("张三"); System.out.println("第一个实例"+p3); //有人动态的切换了实现 Prototype p2 = new ConcretePrototype2(); PrototypeManager.setPrototype("p1", p2); //重新获取原型来创建对象 Prototype p4 = PrototypeManager.getPrototype("p1").clone(); p4.setName("李四"); System.out.println("第二个实例"+p4); //有人注销了这个原型 PrototypeManager.removePrototype("p1"); //再次获取原型来创建对象 Prototype p5 = PrototypeManager.getPrototype("p1").clone(); p5.setName("王五"); System.out.println("第三个实例:" + p5); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }