您的位置:首页 > 其它

设计模式之原型模式(Prototype Pattern)

2015-10-30 20:22 676 查看
一、原型模式(Prototype Pattern)介绍:

原型模式(Prototype Pattern)定义如下:

Specifythe kinds of objects to create using a prototypicalinstance,and create new objectsby copyingthis prototype.

(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)

由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。

目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的

结构,还与原型对象具有相同的值。

引入问题:当对象的构造函数非常复杂,在生成新对象的时候非常耗时间、耗资源的情况?我们是怎么来创建呢?

解决方案:通过复制(克隆、拷贝)一个指定类型的对象来创建更多同类型的对象。这个指定的对象可被称

为“原型”对象,也就是通过复制原型对象来得到更多同类型的对象。即原型设计模式。在PHP的很多模板库,都

用到clone。如smarty等。

二、原型模式(Prototype Pattern)结构



三、原型模式(Prototype Pattern)结构解析

参与者

• P r o t o t y p e(G r a p hi c)

—声明一个克隆自身的接口。

• C o n c r e t e P r o t o t y p e(S t aff、W h o l e N o t e、H a l f N o t e)

—实现一个克隆自身的操作。

• C li e n t(G r a p hi c To o l)

—让一个原型克隆自身从而创建一个新的对象。

PS:CV一族,应该很容易理解原型模式的原理,复制,粘贴完后看具体情况是否修改,其实这就是原型模式。

四、原型模式(Prototype Pattern)代码示例(JAVA描述)

/抽象原型类

abstractclassShapeimplementsColneable{

String shapeName;

publicStringgetShapeName(){

retun shapeName;

}

publicvoidsetShapeName(String shapeName){

this.shapeName = shapeName;

}

//实现了Colneable接口的类,可以使用clone()方法复制对象

publicObjectclone(){

try{

returnsuper.clone();

}catch(CloneNotSupportedException e){

System.err.println(“此对象不支持复制”);

}

returnnull;

}

}

五、原型模式(Prototype Pattern)之原型管理器

以上属于简单形式的原型模式:

如果需要创建的原型数目不固定,可以创建一个原型管理器,在复制原型对象之前,

客户端先在原型管理器中查看是否存在满足条件的原型对象,如果有,则直接使用,如果没有,克隆一个,这种称作登记形式的原型模式。适用原型模式可以对客户隐藏产品

的具 体类,因此减少了客户知道的名字的数目,此外是客户无需改变原型模式的缺陷是每个原型的子类都必须实现Cloneable接口,这个实现起来有时候比较困难。

六、原型模式(Prototype Pattern)特点

动机(Motivation)

在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?

如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?

意图(Intent)

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象

七、原型模式(Prototype Pattern)实现

克隆只是实现Prototype原型模式的一种方法,也可以直接通过new对象的方式创建原型实例,二者区别在于:

(1).通过new方式创建的原型和现存的实例对象没有任何联系。

(2).通过克隆方法创建的原型,虽然也是创建新对象,但是将原型实例对象的数据复制到了新的对象中,相当于使用被克隆对象的数据作为克隆对象的初始数据。

Prototype原型设计模式和Singleton单类设计模式是相对的,单类模式中,在整个程序生命周期里,单类模式类的实例对象只有一个。而Prototype原型设计模式则正好相反,

每次都返回的是原型类的不同实例对象。

八、原型模式(Prototype Pattern)应用

类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗;

通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式

一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。

希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)。

隐藏克隆操作的细节。很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

关于Java 中Cloneable接口:

提供了一个Cloneable接口来标示这个对象是可拷贝的,为什么说是“标示”呢?翻开JDK的帮助看看Cloneable是一个方法都没有的,这个接口只是一个标记作用,在JVM中

具有这个标记的对象才有可能被拷贝。那怎么才能从“有可能被拷贝”转换为“可以被拷贝”呢?方法是覆盖clone()方法。

Android中的SparseArray类使用了原型模式,SparseArray类用来代替HashMap。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class 实例 对象