#### 概述

设计模式是面向对象编程的最佳实践。它们的基本原则有两点：

- 编程到接口而不是实现(Program to interface not an implementation)
- 优先选择对象的组合而不是继承(Favor object composition over inheritance)

设计模式共23个，可分为3类：

1. 创建型模式

   提供创建对象的方法。它不是直接通过操作符来实例化对象，而是隐藏了创建的逻辑。这样就提高了程序的灵活性，因为可以依据不同的用例来创建不同的对象。

2. 结构型模式

   关注类与对象之间的组合问题。把接口和对象结合起来以获取新的功能。

3. 行为型模式

   关注对象之间的交互问题。

#### 创建模式

##### 工厂模式

定义：通过工厂类来实现对象的创建，它是为了隐藏创建的逻辑。

实现方法：

- 设计一个接口类，它代表了要创建的对象。
- 设计若干个类来实现这个接口。这些类代表了真正要创建的对象。
- 实现一个工厂类，它的名字一般会叫做XXXFactory。工厂类的作用是依据传入的参数决定要创建哪个对象。

##### 单例模式

定义：确保一个类仅创建一个实例，它是为了避免从一个类创建多个实例。

意义：当请求创建一个新的对象时，构造函数就创建并返回一个对象。这样就有可能同一个类创建了多个对象，浪费了系统资源。

实现方法：

- 把构造函数定义为private类型使其不可访问。
- 实现一个getInstance方法用于创建对象。getInstance方法的核心逻辑是：判断对象是否存在，如存在则直接返回该对象，如不存在则创建该对象并返回该对象。该对象被定义为private static类型，这就保证了该对象仅能创建一次。
- 为避免多个进程访问同一个对象，在getInstance内应使用synchronized关键字进行保护。

#### 结构型模式

##### 外观模式

##### 装饰器模式

#### 行为型模式

##### 观察者模式

定义：适用于对象之间存在一对多的依赖关系。当一个对象(subject)的状态发生改变时，所有依赖它的对象(观察者)都会接收到通知。

实现方法：

- 要创建至少一个subject类，它就是观察者要观察的对象。它要提供添加、删除和提醒观察者这三个基本功能。还要实现一个函数，当状态改变时，调用提醒观察者的功能。提醒观察者的功能最终依赖于观察者的update函数。
- 要创建一个所有观察者的抽象类，它一般会设计一个update函数，这样不同的观察者可以实现不同的操作。
- 依据抽象类来实现具体的观察者，重点是实现观察者的update函数。

##### 模板模式

#### 参考资料

1. [Design Patterns](https://www.tutorialspoint.com/design_pattern/design_pattern_overview.htm) : from website tutorialspoint.com
2. **Design Patterns - Elements of Reusable Object-Oriented Software** : Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, 1994