zoukankan      html  css  js  c++  java
  • 设计模式 3.4 Prototype(原型)对象创建模式

      1.意图

      用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

      2.动机

      为了更好的解决关于一个通用的图形编辑器框架和增加一些表示音符、休止符和五线谱的新对象来构建一个乐谱编辑器的问题。我们框架中为音符和五线谱这样的图形构件提供了一个抽象的Graphics类。为定义选择板中的攻击,还提供了一个抽象类Tool。该框架还为一些创建图形对象实例并将它们加入到文档的工具预定义了一个GraphicTool子类。但GraphicTool给框架设计者带来了一个问题。音符和五线谱的类特定于我们的应用,而GraphicTool类却属于框架。GraphicTool不知道如何创建我们的引用类实例,并将它们添加到乐谱中。我们可以为每一种音乐对象创建一个GraphicTool的子类,但这样会产生大量的子类,这些子类仅仅在它们所出售的音乐对象的类别上有所不同。解决办法是让GraphicTool通过拷贝或“克隆”一个Graphic子类的实例来创建新的Graphic,我们称这个实例为一个原型。GraphicTool将它应该克隆和添加到文档中的原型作为参数。如果所有Graphic子类都支持一个Clone操作,那么GraphicTool可以克隆所有种类的Graphic。因此在我们的音乐编辑器中,用于创建音乐对象的每一种工具都是一个用不同原型进行初始化的GraphicTool实例。通过克隆一个音乐对象的原型并将这个克隆添加到乐谱中,每个GraphicTool实例都会产生一个音乐对象。

      3.适用性

      当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式;以及

    • 当要实例化的类时在运行时刻指定时,例如,通过动态装载;或者
    • 为了避免创建一个与产品类层次平行的工厂类层次时;或者
    • 当一个类的实例化只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆他们可能比每次用合适的状态手工实例化该类更方便一些

      5.结构

      

      5.参与者

    • Prototype(Graphic)  ---声明一个克隆自身的接口
    • ConcretePrototype(Staff、WholeNote、HalfNote)  --实现一个克隆自身的操作
    • Client(GraphicTool) --让一个原型克隆自身从而创建一个新的对象

      6.协作

    • 客户请求一个原型克隆自身

      7.效果 

      它对客户隐藏了具体的产品类,因此减少了客户知道的名字的数目。此外,这些模式使客户无需改变即可使用域特定应用相关的类

    • 运行时刻增加和删除产品 Prototype允许只通过客户注册原型实例就可以将一个新的具体产品类并入系统。他比其他创建型模式更为灵活,因为客户可以在运行时刻建立和删除原型
    • 改变值以指定新对象  高度动态的系统允许你通过对象符号定义新的行为。你通过实例化已有类并且将这些实例注册为客户对象的原型,就可以有效定义新类别的对象。可以可以将职责代理给原型,从而表现出新的行为。这种设计使得用户无需编程即可定义新“类”。实际上,克隆一个原型类似于实例化一个类
    • 改变结构以指定新对象  许多应用有部件和子部件来创建对象。我们通过可以把部件Clone一个深拷贝,具有不同结构的对象就可以是原型了。
    • 减少子类的构建  Prototype模式 使得你克隆一个原型而不是请求一个工厂方法产生一个新的对象。
    • 用类动态配置应用  一些运行时刻允许你动态将类装载到应用中。

      8.实现

      当实现原型时,要考虑下面一些问题:

    • 使用一个原型管理器 当一个系统中原型数目不固定时,要保持一个可用原型的注册表。客户不会自己来管理原型,但会在注册表中存储和检索原型。客户在克隆一个原型前会向注册表请求该原型。我们称这个注册表为原型管理器(Prototype manager)。原型管理器是一个管理存储器(associative store),它返回一个与给定关键字匹配的原型。他有一些操作可以用来通过关键字注册原型和解除注册。客户可以在运行时更改甚至或浏览这个注册表。这使得可以无需编写代码就可以扩展并得到系统清单。
    • 实现克隆操作  Prototype模式最困难的部分在于正确实现Clone操作。
    • 初始化克隆对象 你可能不得不引人一个Initialize操作,该操作使用初始化参数并据此设定克隆对象的内部状态

      9.代码示例

        源代码下载:Prototype_MazeGame.rar

  • 相关阅读:
    Leetcode 191.位1的个数 By Python
    反向传播的推导
    Leetcode 268.缺失数字 By Python
    Leetcode 326.3的幂 By Python
    Leetcode 28.实现strStr() By Python
    Leetcode 7.反转整数 By Python
    Leetcode 125.验证回文串 By Python
    Leetcode 1.两数之和 By Python
    Hdoj 1008.Elevator 题解
    TZOJ 车辆拥挤相互往里走
  • 原文地址:https://www.cnblogs.com/lufangtao/p/2475736.html
Copyright © 2011-2022 走看看