设计模式
设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便地复用成功的设计和体系结构。
| 类型 | 创建型 | 结构型 | 行为型 |
|---|---|---|---|
| 类 | 工厂方法 | 适配器(类) | 解释器 模板方法 |
| 对象 | 抽象工厂 建造者 (生成器) 原型 单例 | 适配器(对象) 桥接 组合 装饰者 外观 享元 代理 | 职责链 命令 迭代器 中介者 备忘录 观察者 状态 策略 访问者 |
| 创建型 | 结构型 | 行为型 | |
|---|---|---|---|
| 类 | Factory Method | Adapter (类) | Interpreter Template Method |
| 对象 | Abstract Factory Builder Prototype Singleton | Adapter (对象) Bridge Composite Decorator Facade Flyweight Proxy | Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor |
# 1. 创建型
创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承来改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
随着系统演化得越来越依赖于对象复合而不是类继承,创建型模式变得更为重要。当这种情况发生时,重心从一组固定行为的硬编码 (Hard-coding) 转换为定义一个较小的基本行为集,这些行为可以被组合成任意数目的更复杂的行为。这样创建有特定行为的对象要求的不仅仅是实例化一个类。
在这种模式中有两个不断出现的主旋律。
第一,它们都将关于该系统使用哪些具体的类的信息封装起来。
第二,它们隐藏了这些类的实例是如何被创建和放在一起的。整个系统关于这些对象所知道的是由抽象类所定义的接口。
因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以及何时创建这些方面给予了很大的灵活性。它们允许用结构和功能差别很大的 “产品” 对象配置一个系统。配置可以是静态的 (即在编译时指定),也可以是动态的在运行时。
# 1.1. 抽象工厂
意图
提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。
结构

其中
- AbstractFactory 声明一个创建抽象产品对象的操作接口。
- ConcreteFactory 实现创建具体产品对象的操作。
- AbstractProduct 为一类产品对象声明一个接口。
- ConcreteProduct 定义一个将被相应的具体工厂创建的产品对象,实现 AbstractProduct 接口。
- Client 仅使用由 AbstractFactory 和 AbstractProduct 类声明的接口。
适用性
Abstract Factory 模式适用于:
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当提供一个产品类库,只想显示它们的接口而不是实现时。
# 1.2. 工厂方法
意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
结构

其中
- Product 定义工厂方法所创建的对象的接口。
- ConcreteProduct 实现 Product 接口。
- Creator 声明工厂方法,该方法返回一个 Product 类型的对象。Creator 也可以定义一个工厂方法的默认实现,它返回一个默认的 ConcreteProduct 对象,可以调用工厂方法以创建一个 Product 对象。
- ConcreteCreator 重定义工厂方法以返回一个 ConcreteProduct 实例。
适用性
Factory Method 模式适用于:
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来指定它所创建的对象的类的时候。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
# 1.3. 生成器
意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

其中
- Builder 为创建一个 Product 对象的各个部件指定抽象接口。
- ConcreteBuilder 实现 Builder 的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。
- Director 构造一个使用 Builder 接口的对象。
- Product 表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程。包含定义组成组建的类,包括将这些组件装配成最终产品的接口。
适用性
Builder 模式适用于:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
# 1.4. 原型模式
意图
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
结构

其中
- Prototype 声明一个复制自身的接口。
- ConcretePrototype 实现一个复制自身的操作。
- Client 让一个原型复制自身从而创建一个新的对象。
适用性
Prototype 模式适用于:
- 当一个系统应该独立于它的产品创建、构成和表示时。
- 当要实例化的类是在运行时时刻指定时,例如,通过动态装载。
- 为了避免创建一个与产品类层次平行的工厂类层次时。
- 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。
# 1.5. 单例模式
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
结构

其中
Singleton 指定一个 Instance 操作,允许客户访问它的唯一实例,Instance 是一个类操作;可能负责创建它自己的唯一实例。
适用性
Singleton 模式适用于:
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。
# 1.6. 总结
| 创建型设计模式 | 定义 | 记忆关键字 |
|---|---|---|
| Abstract Factory 抽象工厂模式 | 提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类 | 抽象接口 |
| Builder 构建器模式 | 将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示 | 类和构造分离 |
| Factory Method 工厂方法模式 | 定义一个创建对象的接口,但由子类决定需要实例化哪一个类。使得子类实例化过程推迟 | 子类决定实例化 |
| Prototype 原型模式 | 用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象 | 原型实例, 拷贝 |
| Singleton 单例模式 | 保证一个类只有一个实例,并提供一个访问它的全局访问点 | 唯一实例 |
# 2. 结构型
# 2.1. 适配器模式
意图
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
结构
类适配器使用多重继承对一个接口与另一个接口进行匹配,其结构如图 7-30 所示。对象适配器依赖于对象组合,其结构如图 7-31 所示。

其中
Target 定义 Client 使用的与特定领域相关的接口。
Client 与符合 Target 接口的对象协同。
Adaptee 定义一个已经存在的接口,这个接口需要适配。
Adapter 对 Adaptee 的接口与 Target 接口进行适配。
适用性
- 想使用一个已经存在的类,而它的接口不符合要求。
- 想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
- (仅适用于对象 Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
2.2. 桥接模式
2.3. 组合模式
2.4. 装饰器模式
2.5. 外观模式
2.6. 享元模式
2.7. 代理模式
2.8. 总结

