如何理解原型模式(Prototype)解析(包含源码)
来源:互联网 发布:中万网络待遇 编辑:程序博客网 时间:2024/06/05 06:16
如何理解原型模式(Prototype)解析(包含源码)
JavaScript教程摘要:本文深入浅出的讲述了设计模式中的原型模式,并给出了简单的示例,例子浅显易懂,并附带源代码。
原型模式属于创建型模式,其意图是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这就要求可以通过复制的方法复制一个对象。定制一个通用的图形编辑器框架,编辑器框架可能有一个工具选择板用以将这些图形对象添加到画布上,这个选择板还可能包括选择,移动,和其他操纵音乐对象的工具。用户可以点击选择板上的按钮来画一个图形,或者用户可以选择一个图形移动。这里的关键是定义一个抽象的类,每个选择板上的图形都实现此类的抽象方法,如:选择板上有一个画矩形图形的按钮,当选择这个按钮在画布上点击时,便画出一个图形。解决办法是通过克隆一个矩形的实例来创建新的图形,被克隆的矩形就是原型模式的原型。画出来的矩形通过调整大小参数,移动位置最终达到用户的需求。
适用性:
当一个系统应该独立于他的产品创建,构成和表示时,要使用Prototype模式,以及
当要实例化的类是在运行时刻指定的,或者为了避免创建一个与产品类层次平行的工厂类层次时,或者当一个类的实例只能有几个不同状态组合的一种时。建立相应数目的原型并克隆他们可能比每次用合适的状态手工实例化该类更方便一些。
例如:有一个画板(toolbar)可以从中取到两种图形:圆型(circle)和矩形(rectangle)它们都属于原型(Prototype),当客户需要画一个图形时便从画板中去一个图形,原型模式的关键就在于画板克隆一个图形对象,然后返回给客户。
图1原型模式的UML图
参与者:
Prototype:声明一个克隆自身的接口。
ConcretePrototye(Circle):实现一个克隆自身的操作。
Client:让一个原型克隆自身从而创建一个新的对象。
使用Prototype有以下的效果:
l 运行时刻增加和删除产品,原型模式允许只通过客户注册原型实例就可以将一个新的具体产品并入系统,
l 改变值以指定新对象高度动态的系统允许你通过对象复合定义新的行为。
l 改变结构以指定新对象许多应用由部件和子部件来创建对象,这样的应用通常允许你实例化复杂的,用户定义的结构。
l 减少子类的构造
l 用类动态配置应用一些运行时刻环境允许你动态将类类装载到应用中。
Prototype的主要缺陷是每一个Prototype的子类都必须实现Clone操作,这可能困难,当内部包括一个不支持拷贝或者有循环引用的对象时,实现克隆可能也会困难。
具体代码:
Prototype代码:
package prototype;
publicinterface Prototypeextends Cloneable{
public Object clone();
public String getName();
}
Rectangle代码:
package prototype;
publicclass Rectangleimplements Prototype,Command{
public Object clone(){
Object clone=null;
try{
clone=super.clone();
}catch(CloneNotSupportedException e){
System.err.println("Clone not supported!");
}
return clone;
}
public String getName(){
return"Rectangle";
}
publicvoid draw(){
System.out.println("Draw a rectangle");
}
}
Circle代码:
package prototype;
publicclass Circleimplements Prototype,Command{
public Object clone(){
Object clone=null;
try{
clone=super.clone();
}catch(CloneNotSupportedException e){
System.err.println("Colone not support!");
}
return clone;
}
public String getName(){
return"circle";
}
publicvoid draw(){
System.out.println("Draw a circle");
}
}
Command代码;
package prototype;
publicinterface Command{
publicvoid draw();
}
Toolbar代码:
package prototype;
import java.util.HashMap;
publicclass Toolbar{
private HashMaptools=null;
public Toolbar(){
tools =new HashMap();
tools.put("circle",new Circle());
tools.put("rectangle",new Rectangle());
}
public Object getClone(String key){
Object obj =tools.get(key);
if(obj!=null)return ((Prototype)obj).clone();
returnnull;
}
}
Client代码:
package prototype;
publicclass Client{
publicstaticvoid main(String[] args){
Toolbar tb =new Toolbar();
Command c=(Command)tb.getClone("circle");
c.draw();
c=(Command)tb.getClone("rectangle");
c.draw();
}
}
总结:原型模式在生成复杂对象比较苦难的环境中比较适用,通过克隆已有对象来实现创建新的对象,节省了时间和空间。
0 0
- 如何理解原型模式(Prototype)解析(包含源码)
- 原型模式(Prototype Pattern)案例解析
- 原型模式(Prototype)解析例子
- 原型模式(Prototype)
- 原型模式(prototype)
- 原型(Prototype)模式
- 原型(ProtoType)模式
- 原型模式(Prototype)
- 原型模式(Prototype)
- Prototype(原型模式)
- 原型(Prototype)模式
- Prototype(原型模式)
- PROTOTYPE(原型)模式
- 原型模式(ProtoType)
- 原型(prototype)模式
- 原型模式(Prototype)
- 原型模式(Prototype)
- 原型模式(Prototype)
- 日经春秋 20150314
- 【成长记录】iOS程序图标的基本控制
- Linux远程挂载
- Sqlstate详解
- 安装genmotion过程
- 如何理解原型模式(Prototype)解析(包含源码)
- OA的学习--第一篇--学习之后的感想
- PAT 1012. The Best Rank (25)
- 僵尸进程
- 日经社説 20150314 北陸の持続的成長のばねに
- 你好,明天!再见,传智!----致全体传智播客同仁的一封公开信
- JSP小项目,会员管理系统之实现注册功能
- ZXPortMap 端口映射源代码
- Console命令详解,让调试js代码变得更简单