- 浏览: 84885 次
- 性别:
- 来自: 龙城
最新评论
-
Fis:
阿呆jinsss 写道 楼主说的简单易懂,最适合我这些理解能力 ...
[原创]AS3.0的自定义事件 -
阿呆jinsss:
楼主说的简单易懂,最适合我这些理解能力差点的人,谢谢了~
[原创]AS3.0的自定义事件 -
Fis:
mengxiaolongcz 写道外层循环 i<arr. ...
去除数组中相同的元素 -
Fis:
mengxiaolongcz 写道外层循环 i<arr. ...
去除数组中相同的元素 -
mengxiaolongcz:
外层循环 i<arr.length-1
里层循环 var ...
去除数组中相同的元素
您从图书馆的期刊从发现了几篇您感兴趣的文章,由于这是图书馆的书,您不可以直接在书中作记号或写字,所以您将当中您所感兴趣的几个主题影印出来,这下子您就可在影印的文章上画记重点。
Prototype模式的作用有些类似上面的描述,您在父类别中定义一个clone()方法,而在子类别中重新定义它,当客户端对于所产生的物件有兴趣并想加以利用,而您又不想破坏原来的物件,您可以产生一个物件的复本给它。
Prototype具有展示的意味,就像是展览会上的原型车款,当您对某个车款感兴趣时,您可以购买相同款示的车,而不是车展上的车。
在软体设计上的例子会更清楚的说明为何要进行物件复制,假设您要设计一个室内设计软体,软体中有一个展示家具的工具列,您只要点选工具列就可以产生一个家具复本,例如一张椅子或桌子,您可以拖曳这个复制的物件至设计图中,随时改变它的位置、颜色等等,当您改变设计图中的物件时,工具列上的原型工具列是不会跟着一起改变的,这个道理是无需解释的。
下面的 UML 类别图表示了上述的简单概念:
protoType-1.jpg
Prototype模式的重点在于clone(),它负责复制物件本身并传回,但这个clone()本身在实作上存在一些困难,尤其是当物件本身又继承另一个物件时,如何确保复制的物件完整无误,在不同的程式语言中有不同的作法。
在Java中的作法是透过实作一个Cloneable介面,它只是一个声明的介面,并无规定任何实作的方法,您的目的是改写Object的clone ()方法,使其具备有复制物件的功能,这个方面建议您参考:How to avoid traps and correctly override methods from java.lang.Object。
用一个简单的例子来实作上图中的结构,这个例子利用了Java语言本身的clone特性:
AbstractFurniture.java
CircleTable与SquareTable继承了AbstractFurniture,并实作clone方法,用于传回本身的复制品:
CircleTable.java
SquareTable.java
House是个虚拟的房屋物件,从Prototype复制出来的物件加入至House中:
House.java
再来是应用程式本身:
Application.java
Java中的clone()方法是继承自Object,AbstractFurniture的子类别则override这个clone()方法,以复制其本身并传回。
下图为Prototype模式的类别结构图:
protoType-2.jpg
在 Gof 的设计模式书中给出一个原型模式的应用:一个通用的图型编辑器 Framework。在这个 Framework中有一个工具列,您可以在上面选择音乐符号以加入乐谱中,并可以随时调整音乐符号的位置等等。
图型编辑器Framework是通用的,然而它并不知道这些音乐符号的型态,有人或许会想到继承图型编辑器Framework来为每个音乐符号设计一个框架子类别,但由于音乐符号的种类很多,这会产生相当多的子类别,为了避免这种情况,可以透过Prototype模式来减少子类别的数目,可以设计出以下的结构:
protoType-3.jpg
依照这个结构,图型编辑器的Framework可以独立于要套用的特定类别之外,虽然不知道被复制传回的对象型态是什么,但总可以按照 Graphics所定义的介面来操作这些物件。
我的小结:个人认为Prototype模式的核心在于对象的克隆方法,为对象添加了这样一个方法,能轻松的实现各种用户的试体验功能。
Prototype模式的作用有些类似上面的描述,您在父类别中定义一个clone()方法,而在子类别中重新定义它,当客户端对于所产生的物件有兴趣并想加以利用,而您又不想破坏原来的物件,您可以产生一个物件的复本给它。
Prototype具有展示的意味,就像是展览会上的原型车款,当您对某个车款感兴趣时,您可以购买相同款示的车,而不是车展上的车。
在软体设计上的例子会更清楚的说明为何要进行物件复制,假设您要设计一个室内设计软体,软体中有一个展示家具的工具列,您只要点选工具列就可以产生一个家具复本,例如一张椅子或桌子,您可以拖曳这个复制的物件至设计图中,随时改变它的位置、颜色等等,当您改变设计图中的物件时,工具列上的原型工具列是不会跟着一起改变的,这个道理是无需解释的。
下面的 UML 类别图表示了上述的简单概念:
protoType-1.jpg
Prototype模式的重点在于clone(),它负责复制物件本身并传回,但这个clone()本身在实作上存在一些困难,尤其是当物件本身又继承另一个物件时,如何确保复制的物件完整无误,在不同的程式语言中有不同的作法。
在Java中的作法是透过实作一个Cloneable介面,它只是一个声明的介面,并无规定任何实作的方法,您的目的是改写Object的clone ()方法,使其具备有复制物件的功能,这个方面建议您参考:How to avoid traps and correctly override methods from java.lang.Object。
用一个简单的例子来实作上图中的结构,这个例子利用了Java语言本身的clone特性:
AbstractFurniture.java
public abstract class AbstractFurniture implements Cloneable { public abstract void draw(); // 在Design Pattern上,以下的clone是抽象未实作的 // 实际上在Java中class都继承自Object // 所以在这边我们直接重新定义clone() // 这是为了符合Java现行的clone机制 protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
CircleTable与SquareTable继承了AbstractFurniture,并实作clone方法,用于传回本身的复制品:
CircleTable.java
import java.awt.*;public class CircleTable extends AbstractFurniture { protected Point center; public void setCenter(Point center) { this.center = center; } protected Object clone () throws CloneNotSupportedException { Object o = super.clone(); if(this.center != null) { ((CircleTable) o).center = (Point) center.clone(); } return o; } public void draw() { System.out.println("\t圆桌\t中心:(" + center.getX() + ", " + center.getY()+ ")"); } }
SquareTable.java
import java.awt.*;public class SquareTable extends AbstractFurniture { protected Rectangle rectangle; public void setRectangle(Rectangle rectangle) { this.rectangle = rectangle; } protected Object clone () throws CloneNotSupportedException { Object o = super.clone(); if(this.rectangle != null) { ((SquareTable) o).rectangle = (Rectangle) rectangle.clone(); } return o; } public void draw() { System.out.print("\t方桌\t位置:(" + rectangle.getX() + ", " + rectangle.getY()+ ")"); System.out.println(" / 宽高:(" + rectangle.getWidth() + ", " + rectangle.getHeight()+ ")"); } }
House是个虚拟的房屋物件,从Prototype复制出来的物件加入至House中:
House.java
import java.util.*; public class House { private Vector vector; public House() { vector = new Vector(); } public void addFurniture(AbstractFurniture furniture) { vector.addElement(furniture); System.out.println("现有家具...."); Enumeration enumeration = vector.elements(); while(enumeration.hasMoreElements()) { AbstractFurniture f = (AbstractFurniture) enumeration.nextElement(); f.draw(); } System.out.println(); } }
再来是应用程式本身:
Application.java
import java.awt.*;public class Application { private AbstractFurniture circleTablePrototype; public void setCircleTablePrototype( AbstractFurniture circleTablePrototype) { this.circleTablePrototype = circleTablePrototype; } public void runAppExample() throws Exception { House house = new House(); CircleTable circleTable = null; // 从工具列选择一个家具加入房子中 circleTable = (CircleTable) circleTablePrototype.clone(); circleTable.setCenter(new Point(10, 10)); house.addFurniture(circleTable); // 从工具列选择一个家具加入房子中 circleTable = (CircleTable) circleTablePrototype.clone(); circleTable.setCenter(new Point(20, 30)); house.addFurniture(circleTable); } public static void main(String[] args) throws Exception { Application application = new Application(); application.setCircleTablePrototype( new CircleTable()); application.runAppExample(); } }
Java中的clone()方法是继承自Object,AbstractFurniture的子类别则override这个clone()方法,以复制其本身并传回。
下图为Prototype模式的类别结构图:
protoType-2.jpg
在 Gof 的设计模式书中给出一个原型模式的应用:一个通用的图型编辑器 Framework。在这个 Framework中有一个工具列,您可以在上面选择音乐符号以加入乐谱中,并可以随时调整音乐符号的位置等等。
图型编辑器Framework是通用的,然而它并不知道这些音乐符号的型态,有人或许会想到继承图型编辑器Framework来为每个音乐符号设计一个框架子类别,但由于音乐符号的种类很多,这会产生相当多的子类别,为了避免这种情况,可以透过Prototype模式来减少子类别的数目,可以设计出以下的结构:
protoType-3.jpg
依照这个结构,图型编辑器的Framework可以独立于要套用的特定类别之外,虽然不知道被复制传回的对象型态是什么,但总可以按照 Graphics所定义的介面来操作这些物件。
我的小结:个人认为Prototype模式的核心在于对象的克隆方法,为对象添加了这样一个方法,能轻松的实现各种用户的试体验功能。
发表评论
-
我的开发成长日记(1)
2020-02-05 18:11 02018年是个特别的年 ... -
VR开发中用到的技术总结
2017-12-11 14:32 0使用Unity3D开发VR应用有2年了,刚刚接触都朋友和同 ... -
LayaBox flash 转换项目心得
2015-08-28 13:50 4389一、熟悉从as3项目转到js的API和特性差异 1、Simpl ... -
Starling中AssetManager加载文件的流程整理
2015-06-16 20:15 1329Starling做移动开发,会用到大量的纹理和图片素材、X ... -
LayaBox flash 转换项目心得
2015-08-28 13:46 0一、熟悉从as3项目转到j ... -
金武传
2012-12-08 19:28 0丐帮: 萧峰,远,擒龙功,降魔掌,打狗棒法,降龙十八掌* 洪七 ... -
SWFLoader不响应Event.COMPLETE事件
2012-06-25 16:16 1176工作中遇到了一个问题,flex控件SWFLoader解决了 ... -
PHP中的生成XML文件的4种方法
2012-05-02 14:07 983原文:http://www.oschina.net/code/ ... -
AS3 位运算
2012-04-17 13:04 875原文转至http://www.tangpei.net/2011 ... -
支持参数的事件处理函数
2012-04-11 14:44 3通常情况下,我们使用事件机制时,编写的事件处理函数只需要一 ... -
关于as3运动效果的总结
2012-03-22 18:18 1000看了《ActionScript3.0高级动画教程》一书,用 ... -
ActionScript3高级动画教程笔记
2012-03-14 17:09 7622012.3.14 基本三角函数的计算: 角的正弦值 = ... -
Design Pattern: Adapter 模式 - Class Adapter
2012-03-09 10:42 675Adapter模式的另一种 ... -
Design Pattern: Adapter 模式 - Object Adapter
2012-03-08 16:00 636您的电脑是个旧电脑,新的滑鼠都在使用USB接口了,而您的电 ... -
Design Pattern: Default Adapter 模式
2012-03-08 15:12 958在Java中如果要定义事件处理的方式,必须实作EventL ... -
Design Pattern: Registry of Singleton 模式
2012-03-08 14:23 777考虑使用 Singleton 模式 时拥有子类别的问题,在 ... -
Design Pattern: Singleton 模式
2012-03-08 11:55 763Singleton的英文意义 ... -
Design Pattern: Factory Method 模式
2012-03-07 20:04 726考虑一个状况,您 ... -
Design Pattern: Builder 模式
2012-03-07 19:26 747您想要建立一个迷宫产生程式,迷宫使用二维阵列来定义,0表示 ... -
Design Pattern: Abstract Factory 模式
2012-03-07 18:43 868假设您要制作一个对话方块(Dialog)元件,您希望的是这 ...
相关推荐
Design Pattern: Prototype 模式 Design Pattern: Singleton 模式 Design Pattern: Registry of Singleton 模式 Design Pattern: Default Adapter 模式 31 Design Pattern: Adapter 模式 - Object Adapter 32 ...
DesignPattern项目是设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发...
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...
designpattern design pattern for java 描述: pattern.p001.factory :工厂模式。 pattern.p002.abstractfactory : 抽象工厂模式。 pattern.p003.singletonEH : 单例模式(饿汉式)。 pattern.p003.singletonLH : ...
DesignPattern 在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern ...
design pattern 设计模式 创建型设计模式 创建型模式设计到将对象实例化,这类模式都提供了一个方法,将客户从所需要的实例化对象中解耦。 原型模式 Prototype 结构型设计模式 结构型模式可以让你把类或者对象组合到...
3.设计模式Design Pattern:创建型模式(厂模式Factory、抽象工厂模式Abstract Factory、单例模式Singleton、建造者模式Builder、原型模式Prototype和对象池模式Object Pool Pattern)、结构型模式(适配器模式、...
工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2 结构型模式---这些设计模式关注类和...
3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构...
原型模式(Prototype Pattern) 结构型模式 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) ...
- creational(创建型模式) |- simplefactory 简单工厂模式案例 |- factorymethod 工厂方法模式案例 |- abstractfactory 抽象工厂模式案例 |- builder 建造者模式案例 |- prototype 原型模式案例 |- singleton 单例...
Learn how to implement design patterns in Java: each pattern in Java Design Patterns is a complete implementation and the output is generated using Eclipse, making the code accessible to all....
(二) 确保对象的唯一性——单例模式 (三) 确保对象的唯一性——单例模式 (四) 确保对象的唯一性——单例模式 (五) 原型模式-Prototype Pattern 对象的克隆——原型模式(一) 对象的克隆——原型模式(二) ...
第07章 照猫画虎:原型模式 (Prototype) 第08章 独一无二:单例模式 (Singleton) 第09章 一目了然:外观模式 (Facade) 第10章 改头换面:适配器模式 (Adapter) 第11章 越俎代庖:代理模式 (Proxy) 第12章 真人不露相...
★附录A介绍了剩下的设计模式:Bridge(桥接)、Builder(生成器)、Chainof Responsibility(责任链)、Flyweight(蝇量)、Interpreter(解释器)、Mediator(中介者)、Memento(备忘录)、Prototype(原型)、...
C#设计模式(9)-Prototype Pattern C#设计模式(8)-Builder Pattern C#设计模式(7)-Singleton Pattern C#设计模式(6)-Abstract Factory Pattern C#设计模式(5)-Factory Method Pattern C#设计模式(4)...
设计模式设计模式:可重用的面向对象软件的元素栏目:如何构建“运行”: Microsoft Visual Studio 2017 v15.7或更高版本Microsoft .Net Framework v4.7或更高版本Microsoft Visual C ++ 2017年
PROTOTYPE PATTERN ADAPTER PATTERN COMPOSITE PATTERN PROXY PATTERN FAÇADE PATTERN DECORATOR PATTERN FLYWEIGHT PATTERN TEMPLATE METHOD PATTERN MEDIATOR PATTERN CHAIN OF RESPONSIBILITY ... OBSERVER ...
#DesignPattern 《研磨设计模式》书中的例子 --第二章:简单工厂 本质:选择实现 --第三章:外观模式(Facade) 本质:封装交互,简化调用 --第四章:适配器模式(Adapter) 本质:转换匹配,复用功能 --第五章:单例...