原型模式

应用于“复制”操作的模式

使用情景

单例模式类图

工厂方法

工厂方法也称为虚构造器。适用情况:一个类无法预期需要生成哪个类的对象,想让其子类来指定所生成的对象。

使用情景

与直接创建新的对象相比,使用工厂方法创建对象可算作一种最佳的做法。工厂方法模式让客户程序可以要求由工厂方法创建的对象拥有一组共同的行为。所以往类层次结构中引入新的具体产品并不需要修改客户端代码,国为返回的任何具体对象的接口都跟客户端一直在用的从前的接口相用。

工厂方法类图

抽象工厂

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

抽象工厂与工厂方法的对比
抽象工厂 工厂方法
通过对象组合创建抽象产品 通过类继承创建抽象产品
通过对象组合创建抽象产品 通过类继承创建抽象产品
必须修改父类的接口才能支持新的产品 子类化创建者并重载工厂方法以创建新产品

黄金法则:变动需要抽象。


当现有的抽象工厂需要支持新的产品时,需要向父类添加相应的新工厂方法。这意味着也要修改其子类以支持新产品的新工厂方法。

抽象工厂类图

生成器模式

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

使用情景
生成器与抽象工厂的对比
生成器 抽象工厂
构建复杂对象 构造简单或复杂对象
以多个步骤构建对象 以单一步骤构建对象
以多种方式构建对象 以单一方式构建对象
在构建过程的最后一步返回产品 立刻返回产品
专注一个特定产品 强调一套产品


aClient要从aBuilder得到产品,需要知道aDirector和aBuilder。你可能想知道,如果让aDirector从它的construct方式返回产品,或getRusult以某种方式在aDirector中实现,是否aClient可以不必知道aBuilder,那样的话,aDirector就变成了工厂,它的construct方法就变成了返回抽象产品的工厂。而且,aDirector将与所有支持的产品固定在一起,这降低了模式的可复用性。整体思想是分离“什么”与“如何”,使得aDirector能把同一个“什么”(规格)应用到不同的aBuilder,而它懂得“如何”按照给定的规格建造自己特定产品,反之亦然。

生成器模式类图

生成器模式时序图