定义与结构
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式的结构:
1) 客户角色:让一个原型克隆自己来得到一个新对象。
2) 抽象原型角色:实现了自己的 clone 方法,扮演这种角色的类通常是抽象类,且它具有
许多具体的子类。
3) 具体原型角色:被复制的对象,为抽象原型角色的具体子类。
源代码:
class PrototypeManager {
private static PrototypeManager pm;
private Map prototypes=null;
private PrototypeManager() {
prototypes=new HashMap();
}
//使用单例模式来得到原型管理器的唯一实例
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 Prototype getPrototype(String name) {
if(prototypes.containsKey(name)) {
//将清单中对应原型的复制品返回给客户
return (Prototype) ((Prototype)prototypes.get(name)).clone();
}else {
Prototype object=null;
try {
object =(Prototype)Class.forName(name).newInstance();
register(name , object);
} catch(Exception e) {
System.err.println("Class "+name+"没有定义!");
}
return object;
。 。 。
原型模式与其它创建型模式有着相同的特点:它们都将具体产品的创建过程进行包装,使得客户对创建不可知。就像上面例子中一样,客户程序仅仅知道一个抽象产品的接口。当然它还有过人之处:
通过增加或者删除原型管理器中注册的对象, 可以比其它创建型模式更方便的在运行时增加或者删除产品。
如果一个对象的创建总是由几种固定组件不同方式组合而成; 如果对象之间仅仅实例属性不同。将不同情况的对象缓存起来,直接克隆使用。也许这比采用传递参数重新 new 一个对象要来的快一些。
也许你要说:我实在看不出来使用 clone 方法产生对象和 new 一个对象有什么区别;
原型模式使用 clone 能够动态的抽取当前对象运行时的状态并且克隆到新的对象中, 新
对象就可以在此基础上进行操作而不损坏原有对象; 而 new 只能得到一个刚初始化的对象,
而在实际应用中,这往往是不够的。
说了这么多,大家可能会认为原型模式的关键就在于clone。我觉要回归到它的定义“用原型实例指定创建对象的种类,并且通过拷贝这些原型对象创建新的对象”。这里的原型实例通常应该是处于运行时的某一时刻的对象。用重新new不方便得到一个一样的对象的时候,就可以考虑使用原型模式