《JAVA与模式》第6天―原型模式 (三)

2014-11-24 08:24:30 · 作者: · 浏览: 6
间:2012-6-25 下午04:54:55
*
* @类说明 :原型管理器角色保持一个聚集,作为对所有原型对象的登记,这个角色提供必要的方法,供外界增加新的原型对象和取得已经登记过的原型对象。
*/
public class PrototypeManager {
/**
* 用来记录原型的编号和原型实例的对应关系
*/
private static Map map = new HashMap();

/**
* 私有化构造方法,避免外部创建实例
*/
private PrototypeManager() {
}

/**
* 向原型管理器里面添加或是修改某个原型注册
*
* @param prototypeId
* 原型编号
* @param prototype
* 原型实例
*/
public synchronized static void setPrototype(String prototypeId, Prototype prototype) {
map.put(prototypeId, prototype);
}

/**
* 从原型管理器里面删除某个原型注册
*
* @param prototypeId
* 原型编号
*/
public synchronized static void removePrototype(String prototypeId) {
map.remove(prototypeId);
}

/**
* 获取某个原型编号对应的原型实例
*
* @param prototypeId
* 原型编号
* @return 原型编号对应的原型实例
* @throws Exception
* 如果原型编号对应的实例不存在,则抛出异常
*/
public synchronized static Prototype getPrototype(String prototypeId) throws Exception {
Prototype prototype = map.get(prototypeId);
if (prototype == null) {
throw new Exception("您希望获取的原型还没有注册或已被销毁");
}
return prototype;
}
}
package com.bankht.Prototype.register;

import java.util.HashMap;
import java.util.Map;

/**
* @author: 特种兵—AK47
* @创建时间:2012-6-25 下午04:54:55
*
* @类说明 :原型管理器角色保持一个聚集,作为对所有原型对象的登记,这个角色提供必要的方法,供外界增加新的原型对象和取得已经登记过的原型对象。
*/
public class PrototypeManager {
/**
* 用来记录原型的编号和原型实例的对应关系
*/
private static Map map = new HashMap();

/**
* 私有化构造方法,避免外部创建实例
*/
private PrototypeManager() {
}

/**
* 向原型管理器里面添加或是修改某个原型注册
*
* @param prototypeId
* 原型编号
* @param prototype
* 原型实例
*/
public synchronized static void setPrototype(String prototypeId, Prototype prototype) {
map.put(prototypeId, prototype);
}

/**
* 从原型管理器里面删除某个原型注册
*
* @param prototypeId
* 原型编号
*/
public synchronized static void removePrototype(String prototypeId) {
map.remove(prototypeId);
}

/**
* 获取某个原型编号对应的原型实例
*
* @param prototypeId
* 原型编号
* @return 原型编号对应的原型实例
* @throws Exception
* 如果原型编号对应的实例不存在,则抛出异常
*/
public synchronized static Prototype getPrototype(String prototypeId) throws Exception {
Prototype prototype = map.get(prototypeId);
if (prototype == null) {
throw new Exception("您希望获取的原型还没有注册或已被销毁");
}
return prototype;
}
}

 客户端角色

[java]
package com.bankht.Prototype.register;

/**
* @author: 特种兵—AK47
* @创建时间:2012-6-25 下午04:55:39
*
* @类说明 : 客户端角色
*/
public class Client {
public static void main(String[] args) {
try {
Prototype p1 = new ConcretePrototype1();
PrototypeManager.setPrototype("p1", p1);
// 获取原型来创建对象
Prototype 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.rem