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

一、原型模式(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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值