GoF 23种设计模式速查表


设计模式是针对常见软件设计问题的可重用解决方案。它们提供了一种描述和记录软件架构的方法,以及供开发人员交流软件设计的通用词汇表。 有几种类型的设计模式,包括创建模式、结构模式和行为模式。 创建模式处理对象创建机制,试图以适合情况的方式创建对象。 结构模式处理对象组合,创建对象之间的关系以形成更大的结构。 行为模式关注对象之间的通信、对象之间发生的事情以及它们如何一起运作。

创作模式
1、 单例
单例设计模式用于确保一个类只有一个实例,并为该实例提供一个全局访问点。


  • 使用 Singleton 设计模式的一个优点是它确保一个类只有一个实例,这对于管理数据库连接或网络套接字等资源的类非常有用。
  • 它还提供了对实例的全局访问点,这可以使在代码的不同部分中使用实例变得更加容易。

2、 工厂
提供一种创建对象的方法,而无需指定将创建的对象的确切类。具有创建特定类型对象的方法。该方法将要创建的对象类型作为参数并返回该类型的新对象。


  • 使用工厂设计模式的一个优点是它允许对象的创建集中在一个位置,这可以使代码更加模块化并且更易于维护。
  • 它还允许轻松更改对象创建的实现,这可以使设计更加灵活和可扩展。
  • 允许创建对象而不指定它们的确切类,这可以使代码更通用和可重用。

3、 抽象工厂
提供一个接口,用于创建相关或依赖对象的系列,而无需指定它们的具体类。


  • 系统应该独立于其产品的创建、组合和表示方式。
  • 系统应配置多个产品系列之一。
  • 一系列相关的产品对象旨在一起使用,您需要强制执行此约束。
  • 当您想要创建与特定应用程序或框架兼容的对象,但您不想在运行时之前指定对象的具体类时很有用。

4、 Builder
允许以逐步的方式创建复杂的对象。它将对象的构造与其表示分开,允许创建不同的表示。


  • 对象创建算法应该与系统分离。
  • 需要创建算法的多种表示。
  • 在不更改核心代码的情况下添加新的创建功能是必要的。
  • 需要对创建过程进行运行时控制。

5、 原型
允许通过复制现有对象来创建新对象,而不是从头开始创建新对象。


  • 在创建复杂对象或创建新对象的成本很高时很有用。
  • 一个类将不知道它需要创建哪些类。
  • 子类可以指定应该创建什么对象。
  • 父类希望将创建推迟到它们的子类。

结构模式
1、 适配器
通过围绕其中一个接口包装一个适配器类,允许两个不兼容的接口一起工作。该适配器类将适配类的接口转换为客户端所期望的接口。


  • 适配器不仅可以将数据转换成各种格式,还可以帮助具有不同接口的对象进行协作。
  • 可以创建可以双向转换调用的双向适配器。

2、 Bridge
允许抽象和实现分离,使两者可以独立变化。


  • 抽象和实现不应在编译时绑定。
  • 抽象和实现应该是独立可扩展的。
  • 抽象实现的变化不应该对客户产生影响。
  • 实施细节应该对客户隐藏。

3、Composite
允许将对象视为一个单元。它用于将对象组合成树结构,并从简单的对象创建复杂的对象。


  • 需要对象的分层表示。
  • 对象和对象的组合应该被统一对待。

4、 装饰器
允许在不改变其结构的情况下向现有对象动态添加新行为。


  • 它可用于向类添加新功能或用附加功能包装现有类。

5、 Facade门面
为复杂系统提供简化的接口。


  • 当系统具有大量互连的类或客户端只需要访问有限数量的系统功能时很有用。
  • 它将客户端与复杂的子系统分离,并允许更容易地维护和修改系统。

6、Flyweight享元
旨在通过在对象之间共享公共数据来最小化内存的使用。这是通过创建一个可供多个对象使用的共享对象来完成的,而不是每个对象都有自己单独的数据实例。


  • 我们可以减少应用程序的内存占用并提高其性能。
  • 仔细考虑内存节省的好处和实施模式增加的复杂性之间的权衡。

7、 代理
在客户端和真实主体之间提供一个中介对象。 代理模式可用于:


  • 为可能昂贵或资源密集型的对象提供占位符。代理可用于仅在需要时创建真实对象,而不是预先创建它。
  • 控制对真实主题的访问。代理可用于实施访问限制或实施身份验证和授权检查。
  • 为真正的主题添加额外的功能。代理可用于拦截对真实主体的请求,并在转发请求之前或之后执行其他任务。


行为模式
1、 责任链
允许对象向对象链发送请求以处理请求。



  • 对于多个对象可能能够处理一个请求的情况很有用,并且事先不知道应该处理该请求的特定对象。
  • 允许在不破坏整体功能的情况下轻松地从链中添加或删除对象。

2、 命令
允许将请求封装为对象,然后可以将其传递给要执行的接收器。


  • 允许分离请求的发送者和接收者。
  • 能够排队或记录请求,并支持撤消/重做功能。

3、 迭代器
允许客户端按顺序访问聚合对象的元素,而不暴露对象的底层表示。


  • 允许客户端以一致、统一的方式遍历对象集合,而不管集合的具体实现如何。

4、 Mediator
允许多个对象在不知道其实现细节的情况下相互通信。


  • 它提供了一个通信的中心点,称为中介,充当对象之间的中介。
  • 在有大量对象需要相互通信的情况下很有用,因为它通过将通信逻辑与对象本身分离来降低系统的复杂性。

5、观察者
允许对象(主题)在其状态更改时通知一组对象(观察者)。观察者模式也称为发布-订阅模式。


  • 当您希望确保各种对象彼此保持同步时,或者当您希望能够独立地重用主题和观察者时,这很有用。

6、策略
允许对象通过切换到不同的策略对象来在运行时更改其行为或策略。


  • 许多相关类之间的唯一区别是它们的行为。
  • 需要算法的多个版本或变体。
  • 算法访问或利用不应向调用代码公开的数据。
  • 类的行为应该在运行时定义。
  • 条件语句复杂且难以维护。

7、 模板法
定义算法的步骤并允许子类覆盖某些步骤,同时仍然保留算法的整体结构。


  • 需要算法的单一抽象实现。
  • 子类之间的共同行为应该局限于一个共同的类。
  • 父类应该能够统一调用其子类中的行为。
  • 大多数或所有子类都需要实现该行为。