原始模型模式有两种表现形式:第一种是简单形式,第二种是登记形式,下面将分别讲解两种原型模型模式的不同实现。
简单形式的原始模型模式
uml类图为:
这种形式涉及到三种角色:
*客户(Client)角色:客户类提出创建对象的请求。
*抽象原型(Prototype)角色:这是一个抽象角色,通常由一个Java接口或者java抽象类实现。
*具体原型(Concrete Prototype)角色:被复制的对象。
以下是一个简单的原型模型的实现。
Client:
package prototype.prototype2; public class Client { private Prototype prototype; public void operation(Prototype example){ Prototype p=(Prototype) example.clone(); } }
Prototype:
package prototype.prototype2; public interface Prototype extends Cloneable { Object clone(); }
ConcretePrototype:
package prototype.prototype2; public class ConcretePrototype implements Prototype { /** * 克隆方法 */ public Object clone(){ try { return (Prototype)super.clone(); } catch (CloneNotSupportedException e) { return null; } } }
登记形式的原始模型模式:
登记形式的原始模型模式有着如下的角色:
*客户端(Client)角色:客户端类向管理员提出创建对象的请求。
*抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体原型类所需的接口。
*具体原型(ConcretePrototype)角色:被复制的对象,需要实现抽象的原型角色所要求的接口。
*原型管理器(PrototypeManager)角色:创建具体原型类的对象,并记录每一个被创建的对象。
以下为一个简单的实现的源码:
Prototype:
package prototype.prototype3; public interface Prototype extends Cloneable { public Object clone(); }
ConcretePrototype:
package prototype.prototype3; public class ConcretePrototype implements Prototype { /** * 克隆方法 */ public synchronized Object clone(){ Prototype temp=null; try { temp=(Prototype) super.clone(); } catch (CloneNotSupportedException e) { System.out.println("Clone failed!"); }finally{ return temp; } } }
PrototypeManager:
package prototype.prototype3; import java.util.Vector; public class PrototypeManager { private Vector objects=new Vector(); /** * 聚集管理方法,增加一个新的对象 */ public void add(Prototype object){ objects.add(object); } /** * 聚集管理方法,取出聚集中的一个对象 */ public Prototype get(int i){ return (Prototype) objects.get(i); } /** * 聚集管理办法:给出聚集的大小 */ public int getSize(){ return objects.size(); } }
Client:
package prototype.prototype3; public class Client { private PrototypeManager mgr; private Prototype prototype; public void registerPrototype(){ prototype=new ConcretePrototype(); Prototype copytype=(Prototype) prototype.clone(); mgr.add(copytype); } }
两种原始模型模式的比较
简单形式和登记形式的原始模型模式各有长短。
如果需要创建的原型对象数目较少而且比较固定的话,可以采用第一种形式,即简单形式的原始模型形式,在这种情况下,原型对象的引用
可以由客户端自己保存。
如果创建的原型对象数目不固定的话,可以采取第二种形式,也即登记形式的原始模型模式,在这种情况下,客户端并不保存对原型对象的引用,
这个任务被交给管理员对象,在复制一个原型对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象,如果有,可以直接从管理员类
取得这个对象引用,如果没有,客户端就需要自行复制此原型对象。