Aha!设计模式(31)-原型(5)

2019-04-13 13:10发布

7. 效果
Prototype有许多和Abstract Factory(3 . 1)和Builder(3 . 2)一样的效果:它对客户隐藏了具体的产品类,因此减少了客户知道的名字的数目。此外,这些模式使客户无需改变即可使用与特定应用相关的类。   隐藏具象类,针对抽象类编程与其说是创建对象模式是的共性,不如说是大多数设计模式的共性。进一步来讲,应该说是面向对象编程这门技术的共性。重要的事情说三遍,对于面对抽象类编程这一点来说,强调多少遍都不为过。
下面列出Prototype模式的另外一些优点。   以下的优点才是原型模式独有的优点。
1 ) 运行时刻增加和删除产品  Prototype允许只通过客户注册原型实例就可以将一个新的具体产品类并入系统。它比其他创建型模式更为灵活,因为客户可以在运行时刻建立和删除原型。   这是原型模式最有用的场景。一般来讲,架构负责规定各种数据,对象交互的方式。架构开发完成以后,我们当然希望它不经变更就可以适用于将来的数据和对象。运行时增加和删除产品使实现这种愿望成为可能。 需要注意的是:这里的产品不是用程序的输出,而是应用程序需要使用和处理的对象。   2 ) 改变值以指定新对象  高度动态的系统允许你通过对象复合定义新的行为 — 例如,通过为一个对象变量指定值 — 并且不定义新的类。你通过实例化已有类并且将这些实例注册为客户对象的原型,就可以有效定义新类别的对象。客户可以将职责代理给原型,从而表现出新的行为。   所谓高度动态的系统,说的就是就是用户可以很自由地定义程序的行为。而这种修改定义的行为,基础的方法是修改参数,高级的方法就是使用已有对象地组合。无论哪种方式,系统的动作模式都是将定义好的对象当作原型,通过克隆这个原型得到新的实例在系统中使用。   这种设计使得用户无需编程即可定义新“类”。实际上,克隆一个原型类似于实例化一个类。Prototype模式可以极大的减少系统所需要的类的数目。在我们的音乐编辑器中,一个GraphicTool类可以创建无数种音乐对象。   这种设计虽然没有通过编程得到新类,但是对于用户来说,和构建新类并生成对象的效果没有什么本质的区别。由于并没有真正构建新类,系统所需的类的数量就会减少了。
  3) 改变结构以指定新对象  许多应用由部件和子部件来创建对象。例如电路设计编辑器就是由子电路来构造电路的 。为方便起见,这样的应用通常允许你实例化复杂的、用户定义的结构,比方说,一次又一次的重复使用一个特定的子电路。
Prototype模式也支持这一点。我们仅需将这个子电路作为一个原型增加到可用的电路元素选择板中。只要复合电路对象将 Clone实现为一个深拷贝(deep copy),具有不同结构的电路就可以是原型了
  本人在大学刚毕业的时候使用的时DOS版的Protel(好像是3.0),这款软件就有元器件的自定义功能:只要通过定义元器件的形状,管脚等简单的操作就可以构建自己的器件库并使用它。学过设计模式才知道,那些功能都可以通过原型模式来实现。 如果没有用过电路板设计软件也没有关系,Office中的图库,模板等可以另外加载的功能都可以考虑使用原型模式来实现。
4 ) 减少子类的构造  Factory Method(3 . 3)经常产生一个与产品类层次平行的 Creator类层次。Prototype模式使得你克隆一个原型而不是请求一个工厂方法去产生一个新的对象。因此你根本不需要Creator类层次。这一优点主要适用于像 C++这样不将类作为一级类对象的语言。像Smalltalk和Objective C这样的语言从中获益较少,因为你总是可以用一个类对象作为生成者。在这些语言中,类对象已经起到原型一样的作用了。   如论哪种方式或者语言,创建对象的过程总是需要的。具体选择哪种模式,一般都是综合代码扩展性,独立性,简洁性各方面的要求来考虑的。选择原型模式的好处就是不再需要一个平行的Creator类层次,坏处就是构建对象的代码和对象本身的代码同时包含在同一个类中。具体采用哪种模式,考验的是设计者根据实际情况运用设计模式的能力。   作者观点   万变不离其宗。   注:   本文中蓝 {MOD}粗体文字都引自《设计模式》一书。   觉得本文有帮助?请分享给更多人。 阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】