设计模式之原型模式(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。
原型模式(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。
相关文章推荐
- Android Native 绘图方法
- Python动态类型的学习---引用的理解
- 土人系列AS入门教程 -- 对象篇
- 交换机升级排障实例
- C#托管堆对象实例包含内容分析
- C#中struct和class的区别详解
- C#实现获取不同对象中名称相同属性的方法
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- VBS ArrayList Class vbs中的数组类
- VBS教程:对象-正则表达式(RegExp)对象
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- C#检查指定对象是否存在于ArrayList集合中的方法
- sql2008启动代理未将对象应用到实例解决方案
- C#编程自学之类和对象
- C++中对象的常引用、动态建立和释放相关知识讲解
- php中将一个对象保存到Session中的方法
- php对象和数组相互转换的方法
- PHP中把对象转换为关联数组代码分享