【设计模式-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.mzph.cn/web/65330.shtml

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

相关文章

谷粒商城-高级篇完结-Sleuth+Zipkin 服务链路追踪

1、基本概念和整合 1.1、为什么用 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位 。主要体现在&#…

小米智能哑铃上市,代理 IP 视角下的智能健身新篇

在智能科技与健康生活深度融合的时代,小米以其敏锐的市场洞察力和强大的创新能力,不断拓展智能生态版图。米家智能哑铃的发布,无疑是其在智能健身领域的又一重要举措。而当我们从代理 IP 的独特视角来审视这一产品,会发现其中蕴含…

基于Python的音乐播放器 毕业设计-附源码73733

摘 要 本项目基于Python开发了一款简单而功能强大的音乐播放器。通过该音乐播放器,用户可以轻松管理自己的音乐库,播放喜爱的音乐,并享受音乐带来的愉悦体验。 首先,我们使用Python语言结合相关库开发了这款音乐播放器。利用Tkin…

实际开发中,常见pdf|word|excel等文件的预览和下载

实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…

微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域

这是一个非常关键且容易混淆的概念 既然 this.globalData.appId appId 是将 appId 存储在内存中,为什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存储)中没有 appId,并且您提出了一个非常重要的疑问:stor…

【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 1. 二叉排序树的基本概念 2. 二叉排序树节点结构体定义 3. 创建二叉排序树 4. 判断是否为二叉排序树 5. 递归查找关键字为 6 的结点并输出查找路径 6. 删除二叉排序树中的节点 测试说明 通关代码 测试结果 任务描述 本关任务&a…

计算机网络(第8版)第3章课后习题--透明传输

【3-11】 试分别讨论以下各种情况在什么条件下是透明传输,在什么条件下不是透明传 输。(提示:请弄清什么是“透明传输”,然后考虑能否满足其条件。) (1)普通的电话通信。 (2)互联网提供的电子邮件服务。 解 答 : 透明传输是指在数据传输…

Linux(17)——使用 DNF 安装和更新软件包

目录 一、使用 DNF 管理软件包: 1、 DNF 查找软件: 2、DNF 安装软件: 3、DNF 删除软件: 二、使用 DNF 管理软件包组: 1、DNF 显示组信息: 2、DNF 安装组: 三、使用 DNF 查看事务历史记录…

基于32单片机的智能语音家居

一、主要功能介绍 以STM32F103C8T6单片机为控制核心,设计一款智能远程家电控制系统,该系统能实现如下功能: 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…

Qt 5.14.2 学习记录 —— 일 新项目

文章目录 1、创建2、查看代码 ---- main.cpp3、查看代码 ---- widgt.h4、查看代码 ---- widgt.cpp和widget.ui5、查看代码 ---- Empty.pro6、运行产生的中间文件 1、创建 左上角的文件,新建文件或项目。如果要写一个GUI程序,应当选择Application&#x…

linux wsl配置 redis远程连接

✅ 1. 修改 Redis 配置文件 在 WSL 的 Redis 配置文件中,找到 redis.conf 或 /etc/redis/redis.conf 文件,编辑以下配置项: ➡️ 更新 bind 配置项 将 bind 127.0.0.1 ::1 修改为: bind 0.0.0.0这样,Redis 将监听所…

Transformer从零详细解读——DASOU讲AI

1. 从全局角度概括Transformer transformer的任务是什么? 进一步细化 进一步细化,注意:每个encoder结构相同,参数不同;decoder同理 原论文中的图如下: 2.Encoder 2.1 输入部分 (1&#xff09…

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代

2024年11月30日,ARM正式发布了其最新的Armv9.5架构,这是Arm技术发展的又一重要里程碑。从表中信息来看,Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升,更是…

【Python运维】使用Python与Docker进行高效的容器化应用管理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着容器化技术的广泛应用,Docker已成为现代软件开发与运维中不可或缺的工具。Docker容器提供了一种轻量级、可移植的方式来部署和管理应用…

分布式系统架构6:链路追踪

这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下…

Ubuntu 20.04安装gcc

一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…

问题:Flask应用中的用户会话(Session)管理失效

我来分享一个常见的PythonWeb开发问题: 问题:Flask应用中的用户会话(Session)管理失效 这是一个在Flask开发中经常遇到的问题。当用户登录后,有时会话会意外失效,导致用户需要重复登录。 解决方案: 1. 首先&#x…

ansible-性能优化

一. 简述: 搞过运维自动化工具的人,肯定会发现很多运维伙伴们经常用saltstack和ansible做比较,单从执行效率上来说,ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解]),但其实…

.net core 线程锁,互斥锁,自旋锁,混合锁

线程锁、互斥锁、自旋锁和混合锁是多线程编程中的重要概念,它们用于控制对共享资源的访问,避免数据竞争和不一致性。每种锁有其特定的适用场景和特点。我们来逐一解释它们,并进行比较。 1. 线程锁(Thread Lock) 线程…

【ArcGISPro/GeoScenePro】检查并处理高程数据

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 数字高程模型 (DEM) 是一种栅格,可显示地面或地形的高程。 数字表面模型 (DSM) 是另一种高程栅格,可显示表面的高度,例如建筑物或树冠的顶部。 您需要准备 DEM 和 DSM 以供分析…