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

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

简单形式的原始模型模式

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

}

两种原始模型模式的比较

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

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

可以由客户端自己保存。

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

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

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

时间: 2024-08-24 05:53:30

原始(prototype)模型模式之简单形式与登记形式的相关文章

5.设计模式----prototype原型模式

原型模式:做到是原型,那肯定是自己本身才是原型,原型模式属于对象的创建模式. 关于原型模式的实现方式分2种: (1)简单形式.(2)登记形式,这两种表现形式仅仅是原型模式的不同实现. 1 package inter.method; 2 /** 3 * 提供一个具有复制本身的接口 4 * @author zengrong 5 * 6 */ 7 public interface Prototype { 8 9 public Object clone(); 10 } 1 package impl.me

JavaScript 面向对象 (prototype 原型模式)

一. JavaScript 设计思想 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力.比如,如果网页上有一栏"用户名"要求填写,浏览器就无法判断访问者是否真的填写了,只有让服务器端判断.如果没有填写,服务器端就返回错误,要求用户重新填写,这太浪费时间和服务器资源了. 因此,网景公司急需一种网页脚本语言,使得浏览器可以与网页互动.工程师_Brend

关于工厂模式(简单以及抽象)

简单工厂模式: 简单工厂模式可以认为是一个创建实例的过程,可以代替new的方式,创建一个新的实例.创建实例new的时候要多考虑一下,看是否可以使用工厂模式,虽然可能多做一些工作,但是系统可能会有更少程度的修改. 直白的说就是把对象创建的过程封装到一个新的类中去,比如这个类创建的初始化过程比较麻烦,按老方法就是把这些全放在这个类的构造函数中,但是这样显然不利于维护,所以就把这部分内容提取出来放到一个新的类中,这个类的某个create方法可以返回一个所需要的对象的实例. 最明显的就是容器中的使用It

设计模式(五):PROTOTYPE原型模式 -- 创建型模式

1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂模式与抽象工厂都是通过工厂封装具体的new操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景的时候,可能使用原型模式更简单也效率更高. • 1)当一个系统应该独立于

深入浅出设计模式 ------ Prototype(原型模式)之深度克隆

继上篇深入浅出设计模式 ------ Prototype(原型模式)的浅克隆实现, 本文进入Prototype(原型模式)的进阶篇----深度克隆. 深度克隆 ---- 序列化方式实现 把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization).写在流里的是对象的一个克隆(新的, 独立的), 而原对象仍存在于JVM内存模型里.因此, 以下代码采用序列化方式实现深度克隆. 第一步: 将上篇的代码做些许改动, 加入对象引用

战略模式和简单工厂

策略算法级: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StrategyDemo { abstract class Strategy { public abstract void BillInterface(); } class ConcreteStrategyA : Strategy { public override void BillInte

java设计模式 -------- 创建模式 之 简单工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂模式是最常用的模式,因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a = new A(),工厂模式也是用来创建用来创建实例对象的,所以以后new时要多个心眼,是否可以考虑使用工厂模式. 简单工厂模式又可以分成三种模式: 1) 普通简单工厂模式 2) 多方法简单工厂模式 3) 多静态方法简单工厂模式 普通简单工厂模式: 举例:(简单的

Reactor 模式的简单实现

Reactor 模式简单实现 在网上有部分文章在描述Netty时,会提到Reactor.这个Reactor到底是什么呢?为了搞清楚Reactor到底是什么鬼,我写了一个简单的Demo,来帮助大家理解他. 网上是这么描述Reactor的: The Reactor design pattern handles service requests that are delivered concurrently to an application by one or more clients. Each

设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式   策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1.组成 -抽象策略角色: 策略类,通常由一个接口或者抽象类实现. -具体策略角色:包装了相关的算法和行为. -环境角色:持有一个策略类的引用,最终给客户端调用. 2.应用场景 - 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. -需要在不同情况下使用不同的策略(算法),或者策略还可能在未来