当前位置: 首页 > news >正文

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了 23 种设计模式。这些模式可以从两个维度进行分类:根据目的和根据作用范围。本文将详细探讨这两种分类方式,并逐一介绍每种模式的功能和应用场景。

1. 根据目的分类

根据设计模式的目的,GoF 将 23 种模式分为三大类:创建型模式结构型模式行为型模式

在这里插入图片描述

1.1 创建型模式(Creational Patterns)

  • 目的:关注对象的创建过程,旨在将对象的创建与使用分离。
  • 模式
    1. 单例模式(Singleton)
      • 功能:确保一个类只有一个实例,并提供全局访问点。
      • 应用场景:数据库连接池、日志管理器。
    2. 工厂方法模式(Factory Method)
      • 功能:定义一个创建对象的接口,由子类决定实例化哪个类。
      • 应用场景:框架中的对象创建,如 Spring 的 Bean 工厂。
    3. 抽象工厂模式(Abstract Factory)
      • 功能:提供一个接口,用于创建相关或依赖对象的家族。
      • 应用场景:跨平台 UI 组件库。
    4. 建造者模式(Builder)
      • 功能:将复杂对象的构建与其表示分离。
      • 应用场景:构建复杂对象,如 HTML 文档。
    5. 原型模式(Prototype)
      • 功能:通过复制现有对象来创建新对象。
      • 应用场景:游戏中的角色复制。

1.2 结构型模式(Structural Patterns)

  • 目的:关注类和对象的组合,旨在形成更大的结构。

  • 模式

    1. 适配器模式(Adapter)
      • 功能:将一个类的接口转换成客户端期望的另一个接口。
      • 应用场景:整合不兼容的接口。
    2. 装饰器模式(Decorator)
      • 功能:动态地为对象添加额外的职责。
      • 应用场景:Java I/O 流。
    3. 代理模式(Proxy)
      • 功能:为其他对象提供一个代理,以控制对其访问。
      • 应用场景:延迟加载、权限控制。
    4. 组合模式(Composite)
      • 功能:将对象组合成树形结构以表示“部分-整体”关系。
      • 应用场景:文件系统、UI 组件树。
    5. 桥接模式(Bridge)
      • 功能:将抽象部分与实现部分分离。
      • 应用场景:多维度变化的系统,如不同形状和颜色的图形。
    6. 外观模式(Facade)
      • 功能:为子系统中的一组接口提供一个统一的接口。
      • 应用场景:简化复杂系统的调用。
    7. 享元模式(Flyweight)
      • 功能:通过共享技术有效地支持大量细粒度对象。
      • 应用场景:文本编辑器中的字符对象。

1.3 行为型模式(Behavioral Patterns)

  • 目的:关注对象之间的职责分配和通信方式。

  • 模式

    1. 观察者模式(Observer)
      • 功能:定义对象间的一对多依赖关系。
      • 应用场景:事件驱动系统,如 GUI 框架中的事件监听。
    2. 策略模式(Strategy)
      • 功能:定义一系列算法,使它们可以互相替换。
      • 应用场景:多种算法或策略的场景,如排序算法。
    3. 命令模式(Command)
      • 功能:将请求封装为对象。
      • 应用场景:撤销操作、任务队列。
    4. 状态模式(State)
      • 功能:允许对象在其内部状态改变时改变其行为。
      • 应用场景:状态机、游戏角色的行为变化。
    5. 模板方法模式(Template Method)
      • 功能:定义一个算法的骨架,将某些步骤延迟到子类中实现。
      • 应用场景:框架中的钩子方法。
    6. 迭代器模式(Iterator)
      • 功能:提供一种方法顺序访问一个聚合对象中的各个元素。
      • 应用场景:集合类的遍历。
    7. 责任链模式(Chain of Responsibility)
      • 功能:将请求的发送者和接收者解耦。
      • 应用场景:审批流程、异常处理链。
    8. 访问者模式(Visitor)
      • 功能:将算法与对象结构分离。
      • 应用场景:编译器中的语法树遍历。
    9. 中介者模式(Mediator)
      • 功能:定义一个中介对象来封装一系列对象之间的交互。
      • 应用场景:聊天室、事件总线。
    10. 备忘录模式(Memento)
      • 功能:捕获并外部化一个对象的内部状态。
      • 应用场景:撤销操作、游戏存档。
    11. 解释器模式(Interpreter)
      • 功能:定义一个语言的文法,并定义一个解释器来解释该语言中的句子。
      • 应用场景:编译器、规则引擎。

2. 根据作用范围分类

根据设计模式的作用范围,GoF 将 23 种模式分为两大类:类模式对象模式

2.1 类模式(Class Patterns)

  • 作用范围:关注类与子类之间的关系,主要通过继承实现。
  • 模式
    • 工厂方法模式(Factory Method)
    • 适配器模式(Adapter,类适配器)
    • 模板方法模式(Template Method)
    • 解释器模式(Interpreter)
2.2 对象模式(Object Patterns)
  • 作用范围:关注对象之间的关系,主要通过组合实现。
  • 模式
    • 单例模式(Singleton)
    • 抽象工厂模式(Abstract Factory)
    • 建造者模式(Builder)
    • 原型模式(Prototype)
    • 适配器模式(Adapter,对象适配器)
    • 装饰器模式(Decorator)
    • 代理模式(Proxy)
    • 组合模式(Composite)
    • 桥接模式(Bridge)
    • 外观模式(Facade)
    • 享元模式(Flyweight)
    • 观察者模式(Observer)
    • 策略模式(Strategy)
    • 命令模式(Command)
    • 状态模式(State)
    • 迭代器模式(Iterator)
    • 责任链模式(Chain of Responsibility)
    • 访问者模式(Visitor)
    • 中介者模式(Mediator)
    • 备忘录模式(Memento)

表 1 介绍了这 23 种设计模式的分类:

范围目的创建型模式结构型模式行为型模式
类模式工厂方法(类)适配器模板方法、解释器
对象模式单例 原型 抽象工厂 建造者代理 (对象)适配器 桥接 装饰 外观 享元 组合策略 命令 职责链 状态 观察者 中介者 迭代器 访问者 备忘录

总结

GoF 的 23 种设计模式从不同角度解决了软件设计中的常见问题。通过根据目的根据作用范围两种分类方式,我们可以更清晰地理解这些模式的核心思想及其适用场景。无论是创建型、结构型还是行为型模式,亦或是类模式和对象模式,它们都为开发人员提供了强大的工具箱,帮助构建灵活、可维护和可扩展的软件系统。


http://www.mrgr.cn/news/82747.html

相关文章:

  • 无线配置实验
  • 【微服务】5、服务保护 Sentinel
  • PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它
  • 【练习】PAT 乙 1022 D进制的A+B
  • 猫咪的猫粮不吃了咋回事?猫不吃猫粮了
  • 纯前端实现将pdf转为图片(插件pdfjs)
  • 代码随想录算法训练营day23
  • 安装Linux
  • Oracle Dataguard(主库为单节点)配置详解(3):配置备库
  • 力扣【SQL连续问题】
  • App窗口创建流程(Android12 )
  • (已开源-AAAI25) RCTrans:雷达相机融合3D目标检测模型
  • 【设计模式-1】软件设计模式概述
  • 【Python】绿色便携版Python制作(发布)方法
  • Oracle Dataguard(主库为单节点)配置详解(2):配置主库
  • 智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之21 再次重建 之6 整“拼” 项目文档+程序框架 总述
  • 【Linux】函数
  • 1.2.1-2部分数据结构的说明02_链表
  • 简历_专业技能_熟悉分布式锁Redisson的原理以及使用
  • QML学习(七) 学习QML时,用好Qt设计器,快速了解各个组件的属性
  • 使用Dinky快速提交Flink operator任务
  • Elasticsearch 入门教程
  • Unity2D初级背包设计中篇 MVC分层撰写(万字详解)
  • 音视频-----RTSP协议 音视频编解码
  • VisualRules规则引擎语法介绍
  • Linux(Ubuntu24.04)源码编译安装VTK7.1.1记录