`
- 浏览:
495729 次
- 性别:
- 来自:
北京
-
http://tianli.blog.51cto.com/190322/40705
摘要:本文深入浅出的讲述了设计模式中的原型模式,并给出了简单的示例,例子浅显易懂,并附带源代码。
原型模式属于创建型模式,其意图是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这就要求可以通过复制的方法复制一个对象。定制一个通用的图形编辑器框架,编辑器框架可能有一个工具选择板用以将这些图形对象添加到画布上,这个选择板还可能包括选择,移动,和其他操纵音乐对象的工具。用户可以点击选择板上的按钮来画一个图形,或者用户可以选择一个图形移动。这里的关键是定义一个抽象的类,每个选择板上的图形都实现此类的抽象方法,如:选择板上有一个画矩形图形的按钮,当选择这个按钮在画布上点击时,便画出一个图形。解决办法是通过克隆一个矩形的实例来创建新的图形,被克隆的矩形就是原型模式的原型。画出来的矩形通过调整大小参数,移动位置最终达到用户的需求。
适用性:
当一个系统应该独立于他的产品创建,构成和表示时,要使用Prototype模式,以及
当要实例化的类是在运行时刻指定的,或者为了避免创建一个与产品类层次平行的工厂类层次时,或者当一个类的实例只能有几个不同状态组合的一种时。建立相应数目的原型并克隆他们可能比每次用合适的状态手工实例化该类更方便一些。
例如:有一个画板(toolbar)可以从中取到两种图形:圆型(circle)和矩形(rectangle)它们都属于原型(Prototype),当客户需要画一个图形时便从画板中去一个图形,原型模式的关键就在于画板克隆一个图形对象,然后返回给客户。
图1原型模式的UML图
参与者:
Prototype:声明一个克隆自身的接口。
ConcretePrototye(Circle):实现一个克隆自身的操作。
Client:让一个原型克隆自身从而创建一个新的对象。
使用Prototype有以下的效果:
l 运行时刻增加和删除产品,原型模式允许只通过客户注册原型实例就可以将一个新的具体产品并入系统,
l 改变值以指定新对象 高度动态的系统允许你通过对象复合定义新的行为。
l 改变结构以指定新对象 许多应用由部件和子部件来创建对象,这样的应用通常允许你实例化复杂的,用户定义的结构。
l 减少子类的构造
l 用类动态配置应用 一些运行时刻环境允许你动态将类类装载到应用中。
Prototype的主要缺陷是每一个Prototype的子类都必须实现Clone操作,这可能困难,当内部包括一个不支持拷贝或者有循环引用的对象时,实现克隆可能也会困难。
具体代码:
Prototype代码:
package prototype;
public interface Prototype extends Cloneable{
public Object clone();
public String getName();
}
Rectangle代码:
package prototype;
public class Rectangle implements 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";
}
public void draw(){
System.out.println("Draw a rectangle");
}
}
Circle代码:
package prototype;
public class Circle implements 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";
}
public void draw(){
System.out.println("Draw a circle");
}
}
Command代码;
package prototype;
public interface Command{
public void draw();
}
Toolbar代码:
package prototype;
import java.util.HashMap;
public class Toolbar{
private HashMap tools=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();
return null;
}
}
Client代码:
package prototype;
public class Client{
public static void main(String[] args){
Toolbar tb = new Toolbar();
Command c=(Command)tb.getClone("circle");
c.draw();
c=(Command)tb.getClone("rectangle");
c.draw();
}
}
总结:原型模式在生成复杂对象比较苦难的环境中比较适用,通过克隆已有对象来实现创建新的对象,节省了时间和空间。
本文出自 “凌辉” 博客,请务必保留此出处http://tianli.blog.51cto.com/190322/40705
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
另外,像XML配置文件的解析、对象关系映射ORM工具等,也可能使用原型模式来快速创建和初始化对象。 总的来说,原型模式是一种实用的设计模式,它为创建对象提供了一种便捷的方式,尤其在对象创建成本高、结构相对...
本文将深入探讨一种常见的设计模式——原型模式(Prototype Pattern),并结合具体的iOS应用场景进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建...
本文将深入探讨Android设计模式中的“原型模式”(Prototype Pattern),并结合提供的"prototype"压缩包中的示例代码进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而...
这个例子展示了如何在实际应用中使用原型模式。通过克隆对象,我们可以快速创建类似但独立的对象,而不需要每次都通过完整的构造流程来创建新对象。这种方式在处理复杂对象创建或大量创建相似对象时特别有效,因为它...
### JavaScript组合使用构造函数模式和原型模式实例解析 #### 一、引言 在JavaScript编程中,构造函数模式和原型模式是两种常见的面向对象编程(OOP)方式。这两种模式各有优势,结合使用能够更好地实现代码复用和...
- **1.5 Prototype模式**:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这种模式非常适合于创建大量相似对象的情况,可以显著减少内存开销。 #### 2. 结构型模式 结构型模式处理的是类和...
5. **原型模式**(Prototype) - **描述**:通过复制一个已有的实例来创建新的实例。适用于对象初始化成本较高的场景。 - **示例**:游戏中的NPC克隆。 6. **适配器模式**(Adapter) - **描述**:将一个类的...
### 我所理解的从原型到原型链 在JavaScript中,理解原型(Prototype)与原型链(Prototype Chain)是至关重要的。这两个概念是语言的核心部分,对于...希望这篇解析能够帮助你更好地理解原型和原型链的概念及其应用。
什么是原型:在了解原型链之前我们先来看看一个函数在创建过程中做了哪些事情,举一个空函数的例子:当我们在代码里面声明这么一个空函数,js解析的本质是:1、创建一个对象(有constructor属性及[[Prototype]]属性...
这类模式关注对象的创建过程,包括单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。它们提供了一种方式来推迟对象的...
这些例子可能涵盖各种继承模式,如经典继承、寄生组合式继承、原型链式继承等。 总的来说,这篇"prototype学习笔记"深入讲解了JavaScript中的原型和继承机制,结合源码分析和实用工具,帮助开发者更全面地掌握这一...
### C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式) #### 概述 在面向对象编程中,设计模式是一种被广泛接受的解决方案,用于解决常见的软件设计问题。其中,原型模式(Prototype Pattern)属于...
当试图访问`obj.toString`或`obj.valueOf`时,由于这些方法不在`obj`自身,所以会沿着原型链找到`Object.prototype`并返回对应的方法。 接下来,我们讨论`Object.create`。这个函数允许我们创建一个新对象,其原型...
1. **创建型模式**:这类模式主要用于对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。它们帮助我们在不...
`prototype1.4版本开发手册`可能是指一个针对JavaScript中的原型机制进行深入解析的文档,适合初学者了解和学习这一概念。 JavaScript是一种基于原型的面向对象语言,这意味着每个对象都有一个内部属性`__proto__`...
原型模式(Prototype) 原型模式是一种创建型设计模式,它使用现有的对象实例作为原型,通过复制这些原型来创建新对象。这种模式避免了每次创建新对象时都要重新初始化的过程,从而提高了性能。文章中提到的“QQ”...
4. 原型模式(Prototype Pattern):原型模式是一种创建型设计模式,它通过复制已有对象来创建新对象,避免了创建新对象的复杂过程。在例子中,复制情话模板(prototype)到QQ聊天中,减少了每次都需要编写新情话的...
在这个例子中,`MyObject`的`prototype`被用来添加`name`属性和`sayHello`方法。当创建`instance`时,它继承了`MyObject.prototype`,因此能够访问和调用这些属性和方法。 ### 5. 原型和`new`关键字 `new`关键字在...
通过Ajax.Request,开发者可以轻松地向服务器发送数据,获取XML响应,然后使用Prototype提供的工具进行解析和操作,实现页面的无刷新更新。 总结,Prototype库为开发者提供了强大且易用的Ajax功能,特别是处理XML...