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

news2025/1/10 7:18:18

在软件工程领域,设计模式是解决常见设计问题的经典方案。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.coloradmin.cn/o/2274212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最好用的图文识别OCR -- PaddleOCR(2) 提高检测识别精度 推理效率(PPOCR模型转ONNX模型进行推理)

提高检测识别精度 && 推理效率 基于项目环境准备高效率版本1 下载模型与相关资源2. 模型转换3. 转换后效果测试测试图片示例:使用 PaddleOCR 模型进行推理:使用转换后的 ONNX 模型进行推理: 高精度版本1 下载模型与相关资源2 配置Pad…

保护性暂停原理

什么是保护性暂停? 保护性暂停(Guarded Suspension)是一种常见的线程同步设计模式,常用于解决 生产者-消费者问题 或其他需要等待条件满足后再继续执行的场景。通过这种模式,一个线程在执行过程中会检查某个条件是否满…

Linux 工作队列

系列文章目录 Linux内核学习 Linux 知识(1) Linux 知识(2) Linux 工作队列 Linux 内核源代码情景分析(一) Linux 设备驱动程序(二) 文章目录 系列文章目录综述工作(work_…

计算机的错误计算(二百零六)

摘要 电脑准备关机时,看到不知什么时候触发跳出了一个**AI助手页面。里面有关于等价的讨论内容,特记录,以警世人:大模型犯错,不是个别现象。 例1. 下面是对话。问题是: 和 等价吗?在 (0, ) …

支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测

简单说明 支持向量回归是一种用来做预测的数学方法,属于「机器学习」的一种。 它的目标是找到一条「最合适的线」,能够大致描述数据点的趋势,并允许数据点离这条线有一定的误差(不要求所有点都完全落在这条线上)。 可以把它想象成:找到一条「宽带」或「隧道」,大部分…

web作业

作业一 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> </head&g…

(六)ROS通讯机制——常用命令

前言 下面这些主要是一些通讯中经常用到的一些命令&#xff0c;大家需要跟着下面的指示操作一遍&#xff0c;有个大致的了解即可。 1.学习目的 机器人系统中启动的节点少则几个&#xff0c;多则十几个、几十个&#xff0c;不同的节点名称各异&#xff0c;通信时使用话题、服…

掌握正则表达式:从入门到精通的实战指南

文章目录 &#x1f30d;一.正则表达式❄️1.为什么学习正则表达式❄️ 2.基本介绍❄️3.分析底层实现 &#x1f30d;二.正则表达式的语法❄️1.字符匹配❄️2.量词❄️3.定位符4.分组和引用❄️6.非贪婪匹配❄️7.分支结构❄️实际应用 &#x1f30d; 三.正则标表达式的三个常用…

【Linux 之一 】Linux常用命令汇总

Linux常用命令 ./catcd 命令chmodclearcphistoryhtoplnmkdirmvpwdrmtailunamewcwhoami 我从2021年4月份开始才开始真正意义上接触Linux&#xff0c;最初学习时是一脸蒙圈&#xff0c;啥也不会&#xff0c;啥也不懂&#xff0c;做了很多乱七八糟&#xff0c;没有条理的笔记。不知…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面&#xff0c;成为Science、Nature论文的…

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…

【Linux】Linux常见指令(上)

个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统&#xff0c;Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…

AI是IT行业的变革力量,还是“职业终结者”?

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 AI是…

mapbox进阶,卷帘对比

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️mapbox-gl-compare 卷帘对比控件二、�…

【开源免费】基于SpringBoot+Vue.JS企业资产管理系统(JAVA毕业设计)

本文项目编号 T 124 &#xff0c;文末自助获取源码 \color{red}{T124&#xff0c;文末自助获取源码} T124&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Linux环境中对Postgrel数据库的安装与配置

一、环境准备 linux操作系统的环境是centos7; Postgrel数据库的版本是12.0&#xff0c;不同版本的下载渠道如下&#xff08;PostgreSQL: File Browser&#xff09;&#xff1a; 可以看到压缩包是比较小的&#xff1b;下载之后&#xff0c;上传到你的linux环境中即可。 二、…

《零基础Go语言算法实战》【题目 1-11】格式化字符串

《零基础Go语言算法实战》 【题目 1-11】格式化字符串 在 Go 语言中&#xff0c;找到使用变量格式化字符串而不打印值的简单方法。 【解答】 在 Go 语言中&#xff0c;在不打印值的情况下进行格式化的最简单方法是使用 fmt.Sprintf() 函数&#xff0c; 它返回一个格式化的…

【机器视觉】OpenCV 图像轮廓(查找/绘制轮廓、轮廓面积/周长、多边形逼近与凸包、外接矩形)

OpenCV官网 7. 图像轮廓 7.1 什么是图像轮廓 图像轮廓是具有相同颜色或灰度的连续点的曲线. 轮廓在形状分析和物体的检测和识别中很有用。 轮廓的作用: 用于图形分析物体的识别和检测 注意点: 为了检测的准确性&#xff0c;需要先对图像进行二值化或Canny操作。画轮廓时…

Elasticsearch:使用 Playground 与你的 PDF 聊天

LLMs作者&#xff1a;来自 Elastic Toms Mura 了解如何将 PDF 文件上传到 Kibana 并使用 Elastic Playground 与它们交互。本博客展示了在 Playground 中与 PDF 聊天的实用示例。 Elasticsearch 8.16 具有一项新功能&#xff0c;可让你将 PDF 文件直接上传到 Kibana 并使用 Pla…