设计模式二【GeekBand】

ABSTRACT FACTORY(抽象工厂)—对象创建型模

意图

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.

适用性

在以下情况可以使用AbstractFactory模式
•一个系统要独立于它的产品的创建、组合和表示时。
•一个系统要由多个产品系列中的一个来配置时。
•当你要强调一系列相关的产品对象的设计以便进行联合使用时。
•当你提供一个产品类库,而只想显示它们的接口而不是实现时。

结构

设计模式二【GeekBand】_第1张图片
image.png

效果

AbstractFactory模式有下面的一些优点和缺点:
1)它分离了具体的类。AbstractFactory模式帮助你控制一个应用创建的对象的类。因为
一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。
2)它使得易于交换产品系列一个具体工厂类在一个应用中仅出现一次—即在它初始化
的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。在我们的用户界面的例子中,我们仅需转换到相应的工厂对象并重新创建接口,就可实现从Motif窗口组件转换为PresentationManager窗口组件。
3)它有利于产品的一致性当一个系列中的产品对象被设计成一起工作时,一个应用一
次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。
4)难以支持新种类的产品难以扩展抽象工厂以生产新种类的产品。这是因为
AbstractFactory接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂接口,这将涉及AbstractFactory类及其所有子类的改变。我们会在实现一节讨论这个问题的一个解决办法。

BUILDER(生成器)—对象创建型模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

适用性

在以下情况使用Builder模式
•当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
•当构造过程必须允许被构造的对象有不同的表示时。

结构

设计模式二【GeekBand】_第2张图片
image.png

效果

这里是Builder模式的主要效果:
1)它使你可以改变一个产品的内部表示Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定
义一个新的生成器。
2)它将构造代码和表示代码分开Builder模式通过封装一个复杂对象的创建和表示方式
提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息;这些类是不出现在Builder接口中的。每个ConcreteBuilder包含了创建和装配一个特定产品的所有代码。这些代码只需要写一次;然后不同的Director可以复用它以在相同部件集合的基础上构作不同的Product。
3)它使你可对构造过程进行更精细的控制Builder模式与一下子就生成产品的创建型模
式不同,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生成器中取回它。因此Builder接口相比其他创建型模式能更好的反映产品的构造过程。这使你可以更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。

FACTORY METHOD(工厂方法)—对象创建型模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。

适用性

在下列情况下可以使用FactoryMethod模式:
•当一个类不知道它所必须创建的对象的类的时候。
•当一个类希望由它的子类来指定它所创建的对象的时候。
•当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类
是代理者这一信息局部化的时候。

结构

设计模式二【GeekBand】_第3张图片
image.png

效果

工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理Product接口;因此
它可以与用户定义的任何ConcreteProduct类一起使用。
工厂方法的一个潜在缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象,
就不得不创建Creator的子类。当Creator子类不必需时,客户现在必然要处理类演化的其他方面;但是当客户无论如何必须创建Creator的子类时,创建子类也是可行的。
下面是FactoryMethod模式的另外两种效果:
1)为子类提供挂钩(hook)用工厂方法在一个类的内部创建对象通常比直接创建对象
更灵活。FactoryMethod给子类一个挂钩以提供对象的扩展版本。
2)连接平行的类层次迄今为止,在我们所考虑的例子中,工厂方法并不往往只是被
Creator调用,客户可以找到一些有用的工厂方法,尤其在平行类层次的情况下。

你可能感兴趣的:(设计模式二【GeekBand】)