原始模型模式有两种表现形式:第一种是简单形式,第二种是登记形式,下面将分别讲解两种原型模型模式的不同实现。
简单形式的原始模型模式
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);
}
}
两种原始模型模式的比较
简单形式和登记形式的原始模型模式各有长短。
如果需要创建的原型对象数目较少而且比较固定的话,可以采用第一种形式,即简单形式的原始模型形式,在这种情况下,原型对象的引用
可以由客户端自己保存。
如果创建的原型对象数目不固定的话,可以采取第二种形式,也即登记形式的原始模型模式,在这种情况下,客户端并不保存对原型对象的引用,
这个任务被交给管理员对象,在复制一个原型对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象,如果有,可以直接从管理员类
取得这个对象引用,如果没有,客户端就需要自行复制此原型对象。