码迷,mamicode.com
首页 > 其他好文 > 详细

原始(prototype)模型模式之简单形式与登记形式

时间:2015-04-22 09:35:20      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:java   设计模式   

原始模型模式有两种表现形式:第一种是简单形式,第二种是登记形式,下面将分别讲解两种原型模型模式的不同实现。

简单形式的原始模型模式

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);
	}

}

两种原始模型模式的比较

简单形式和登记形式的原始模型模式各有长短。

如果需要创建的原型对象数目较少而且比较固定的话,可以采用第一种形式,即简单形式的原始模型形式,在这种情况下,原型对象的引用

可以由客户端自己保存。

如果创建的原型对象数目不固定的话,可以采取第二种形式,也即登记形式的原始模型模式,在这种情况下,客户端并不保存对原型对象的引用,

这个任务被交给管理员对象,在复制一个原型对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象,如果有,可以直接从管理员类

取得这个对象引用,如果没有,客户端就需要自行复制此原型对象。

原始(prototype)模型模式之简单形式与登记形式

标签:java   设计模式   

原文地址:http://blog.csdn.net/u012734441/article/details/45189745

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!