一、创建型设计模式
1、Abstract Factory(抽象工厂)
(1)结构
(2)适用场景
- 一个系统要独立于他的产品的创建、组合和表示时;
- 一个系统要由多个产品系列中的一个来配置时;
- 强调一系列相关产品对象的设计以便进行联合使用;
- 当提供一个产品类库,只想显示他们的接口而不是实现时;
2、Builder(生成器)
(1)目的
将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
(2)结构
(3)适用场景
- 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方法时;
- 当构造过程必须允许被构造的对象有不同的表示时;
3、Factory Method(工厂方法)
(1)目的
定义一个创建对象的接口,让子类决定实例化哪一个类。
(2)结构
(3)适用场景
- 当一个类不知道它所必须创建的对象的类的时候;
- 当一个类希望由它的子类来指定它所创建的对象的时候;
- 当类将创建对象的职责委托给多个子类的某一个,并希望该子类是代理者这一信息局部化的时候;
4、Prototype(原型)
(1)目的
用原型对象指定创建对象的种类,并且通过复制这些原型创建新的对象。
(2)结构
(3)适用场景
- 当一个系统应该独立于它的产品创建、构成和表示时;
- 当要实例化的类是在运行时刻指定时;
- 为了避免创建一个与产品类层次平行的工厂类层次时;
5、Singleton(单例)
(1)目的
保证类只有一个实例,并且提供一个访问它的全局访问点。
(2)结构
(3)适用场景
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它;
- 当这个唯一实例应该是通过子类化可扩展的,并且客户无需更改代码就能使用一个扩展的实例时;
二、结构型设计模式
1、Adapter(适配器模式)
(1)目的
将一个类的接口转换成客户希望的另外一个接口。
适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
(2)结构
(3)适用场景
- 想使用一个已经存在的类,而他的接口不符合要求;
- 想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类协同工作;
- 想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口;
2、Bridge(桥接模式)
(1)目的
将抽象部分与实现部分分离,使它们都可以独立的变化。
(2)结构
(3)适用场景
- 不希望在它的抽象和实现之间有一个固定的绑定关系;
- 类的抽象和实现都可以通过生成子类的方法加以扩充;
- 对一个抽象的实现部分的修改应该不影响客户,即客户不必重新编译;
- 有许多类要生成的类层次结构;
- 想要在多个对象间共享实现,但同时要求客户并不知道这一点;
3、Composite(组合模式)
(1)目的
将对象组合成树型结构以表示 “部分——整体” 的层次结构。
(2)结构
(3)适用场景
- 想表示对象的部分—整体层次结构;
- 希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象;
4、Decorator(装饰模式)
(1)目的
动态地给一个对象添加一些额外的职责。
(2)结构
(3)适用场景
- 在不影响其他对象的情况下,以动态、透明地方式给单个对象添加职责;
- 处理那些可以撤销的职责;
- 当不能采用生成子类的方式扩充时,可以采用装饰模式扩充;
5、Facade(外观模式)
(1)目的
为子系统中的一组接口提供一个一致的界面;
(2)结构
(3)适用场景
- 为一个复杂子系统提供一个简单接口;
- 客户程序与抽象类的实现部分之间存在很大的依赖性;
- 构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点;
6、Flyweight(享元模式)
(1)目的
运用共享技术有效的支持大量细粒度的对象(划分出很多对象)。
(2)结构
(3)适用场景
- 一个应用场景使用了大量的对象;
- 由于使用了大量的对象,造成很大的存储开销;
- 对象的大多数状态都可以变为外部状态;
- 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多对象;
- 应用程序不依赖于对象标识;
7、Proxy(代理模式)
(1)目的
为其他对象提供一种代理以控制对这个对象的访问。
(2)结构
(3)适用场景
- 远程代理,为一个对象在不同地址空间提供局部代表;
- 虚代理,根据需要创建开销很大的对象;
- 保护代理,控制对原始对象的访问;
- 智能引用,取代了简单的指针,在它访问对象时执行一些附加操作;
三、行为型设计模式
1、Chain of Responsibility(责任链模式)
(1)目的
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合现象,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
(2)结构
(3)适用场景
- 有多个对象可以处理一个请求;
- 想在不明确接收者的情况下,向多个对象中的一个提交一个请求;
- 可处理一个请求的对象集合应被动态指定;
2、Command(命令模式)
(1)目的
将一个请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化。
(2)结构
(3)适用场景
- 抽象出待执行的动作以参数化某对象;
- 在不同的时刻指定、排序和执行请求;
- 支持取消操作;
- 支持修改日志;
- 用构建在原语操作上的高层操作构建一个系统;
3、Interpreter(解释器模式)
(1)目的
给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
(2)结构
(3)适用场景
- 该文法简单;
- 效率不是一个关键问题;
4、Iterator(迭代器模式)
(1)目的
提供一个顺序访问一个聚合对象中的各个元素,而且不需要暴露该对象的内部表示,
(2)结构
(3)适用场景
- 访问一个聚合对象的内容而无需暴露它的内部表示;
- 支持对聚合对象的多种遍历;
- 为遍历不同聚合对象提供一个统一接口;
5、Mediator(中介者模式)
(1)目的
用一个中介对象来封装一系列对象交互。
(2)结构
(3)适用场景
- 一组对象间通信复杂,产生的相互依赖关系结构混乱且难以理解;
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用;
- 想定制一个分布在多个类中的行为,而又不想产生太多的子类;
6、Memento(备忘录模式)
(1)目的
在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态。
(2)结构
(3)适用场景
- 必须保存一个对象在某一时刻的部分状态,这样以后需要时它才能恢复到先前的状态;
- 如果一个接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性;
7、Observe(观察者模式)
(1)目的
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
(2)结构
(3)适用场景
- 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在不同的对象中,可以独立的使用与改变;
- 一个对象改变的同时改变其他对象;
- 一个对象必须通知其他对象,但并不指明其他对象是谁;
8、State(状态模式)
(1)目的
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
(2)结构
(3)适用场景
- 一个对象的行为取决于它的状态,并且必须在运行时根据状态来改变行为;
- 一个操作中含有庞大的多分枝的条件语句,且这些分支依赖于该对象的状态;
9、Strategy(策略模式)
(1)目的
定义一系列算法。把他们一个个封装起来,并且使它们可以相互替换,此模式使得算法可以独立于使用它们的客户而变化。
(2)结构
(3)适用场景
- 许多相关的类仅仅是行为有异;
- 需要使用一个算法的不同变体;
- 算法使用客户不应该知道的数据;
10、Template Method(模板方法)
(1)目的
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
(2)结构
(3)适用场景
- 一次性实现一个算法的不变部分;
- 各子类中公共行为被提取出来集中到一个公共父类中,以免代码重复;
- 控制子类扩展;
11、Visitor(访问者模式)
(1)目的
表示一个作用于某对象结构中的各元素的操作。
(2)结构
(3)适用场景
- 一个对象结构有很多类,它们都有不同的接口,而用户想要对这些对象实施一些依赖于其具体类的操作;
- 对一个对象结构中的对象实施一些不相关的操作,避免这些操作“污染”该对象类;
- 经常需要在定义对象结构上定义新的操作;