创建型模式概述
创建型模式抽象了实例化过程 。 它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象
创建型模式通过“对象创建”模式绕开new ,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类) ,从而支持对象创建的稳定。它是接口抽象之后的第一步工作
随着系统演化得越来越依赖于对象复合而不是类继承,创建型模式变得更为重要 。当这种情况发生时,重心从对一组固定行为的硬编码(hard-coding)转移为定义一个较小的基本行为集,这些行为可以被组合成任意数目的更复杂的行为。这样创建有特定行为的对象要求的不仅仅是实例化一个类。
在这些模式中有两个不断出现的主旋律:
第一,它们都将关于该系统使用哪些具体的类的信息封装起来
第二,它们隐藏了这些类的实例是如何被创建和放在一起的 。整个系统关于这些对象所知道的是由抽象类所定义的接口
因此,创建型模式在什么被创建,谁创建它, 它是怎样被创建的,以及何时创建这些方面给予你很大的灵活性 。它们允许你用结构和功能差别很大的“产品”对象配置一个系统。配置可以是静态的(即在编译时指定),也可以是动态的(在运行时)
有时创建型模式是相互竞争的 。 例如:
在有些情况下Prototype或Abstract Factory 用起来都很好
而在另外一些情况下它们是互补的:Builder可以使用其他模式去实现某个构件的创建。Prototype可以在它的实现中使用Singleton
创建型模式有:
一、Prototype意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
二、动机
三、适用性
在下列情况下可以使用Prototype模式:
当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式
当要实例化的类是在运行时刻指定时,例如,通过动态装载
为了避免创建一个与产品类层次平行的工厂类层次时
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们 可能比每次用合适的状态手工实例化该类更方便一些
四、结构
五、参与者
Prototype:声明一个克隆自身的接口
ConcretePrototype:实现一个克隆自身的操作
Client:让一个原型克隆自身从而创建一个新的对象
六、协作
七、效果
Prototype有许多和Abstract Factory和Builder一样的效果:它对客户隐藏了 具体的产品类,因此减少了客户知道的名字的数目。此外,这些模式使客户无需改变即可使 用与特定应用相关的类
下面列出Prototype模式的另外一些优点:
①运行时刻增加和删除产品
Prototype允许只通过客户注册原型实例就可以将一个新的 具体产品类并入系统。它比其他创建型模式更为灵活,因为客户可以在运行时刻建立和删除 原型
②改变值以指定新对象
高度动态的系统允许你通过对象复合定义新的行为—例如,通 过为一个对象变量指定值—并且不定义新的类。你通过实例化已有类并且将这些实例注册 为客户对象的原型,就可以有效定义新类别的对象。客户可以将职责代理给原型,从而表现 出新的行为
这种设计使得用户无需编程即可定义新“类”。实际上,克隆一个原型类似于实例化一个 类。Prototype模式可以极大的减少系统所需要的类的数目
③改变结构以指定新对象
许多应用由部件和子部件来创建对象。例如电路设计编辑器 就是由子电路来构造电路的。为方便起见,这样的应用通常允许你实例化复杂的、用户定 义的结构,比方说,一次又一次的重复使用一个特定的子电路。
Prototype模式也支持这一点。我们仅需将这个子电路作为一个原型增加到可用的电路元 素选择板中。只要复合电路对象将Clone实现为一个深拷贝( deep copy),具有不同结构的电 路就可以是原型了。
④减少子类的构造
Factory Method经常产生一个与产品类层次平行的Creator类 层次。Prototype模式使得你克隆一个原型而不是请求一个工厂方法去产生一个新的对象。因此你根本不需要Creator类层次。这一优点主要适用于像 C + +这样不将类作为一级类对象的语 言。像S m a l l t a l k和Objective C这样的语言从中获益较少,因为你总是可以用一个类对象作为 生成者。在这些语言中,类对象已经起到原型一样的作用了
⑤用类动态配置应用
一些运行时刻环境允许你动态将类装载到应用中。在像 C + +这样的 语言中,P r o t o t y p e模式是利用这种功能的关键
一个希望创建动态载入类的实例的应用不能静态引用类的构造器。而应该由运行环境在 载入时自动创建每个类的实例,并用原型管理器来注册这个实例。这样应用 就可以向原型管理器请求新装载的类的实例,这些类原本并没有和程序相连接
Prototype的主要缺陷 是每一个Prototype的子类都必须实现Clone操作,这可能很困难。例如,当所考虑的类已经存在时就难以新增 Clone操作。当内部包括一些不支持拷贝或有循环引 用的对象时,实现克隆可能也会很困难的
八、实现
九、相关模式
正如我们在这一章结尾所讨论的那样,Prototype和Abstract Factory模式在某种方 面是相互竞争的。但是它们也可以一起使用。 Abstract Factory可以存储一个被克隆的原型的 集合,并且返回产品对象
大量使用Composite和Decorator模式的设计通常也可从Prototype模式处获益
相关文章: