【设计模式-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、为什么用 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位 。主要体现在&#…

基于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…

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…

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架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升,更是…

分布式系统架构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:~…

ansible-性能优化

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

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

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

【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 一、不同访问属性成员的访问方式 1. public成员 2. private成员 3. protected成员 二、观察构造函数和析构函数的执行过程 1. 构造函数 2. 析构函数 三、学习类的组合使用方法 1. 类的组合概念 2. 实现示例 实验步骤 测试说明 …

xilinx的高速接口构成原理和连接结构及ibert工具的使用-以k7 GTX为例

一、相关简介 Xilinx的高速接口称之为transceivers(高速收发器),这部分的电路是专用电路,供电等都是独立的,根据速率可以分为GTP/GTX/GTH/GTY/GTM等。 Xilinx的高速接口是QUAD为单位的,没一个QUAD由一个时钟COMMON资…

rabbitmq——岁月云实战笔记

1 rabbitmq设计 生产者并不是直接将消息投递到queue,而是发送给exchange,由exchange根据type的规则来选定投递的queue,这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage,而实际我们却应该使用自己…

2.系统学习-逻辑回归

逻辑回归 前言最大似然估计概率似然函数(likelihood function)最大似然估计 逻辑回归逻辑回归的似然函数与梯度 分类问题常用评价指标项目案例拓展内容作业 前言 逻辑回归与线性回归均属于广义线性模型,区别在于线性回归用于解决回归问题,例如身高、销量…

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新,就想着更新看看(能否冲掉问题)4、更新没成功,自动重启电脑5、风险文件(好家伙命名还挺规范,一看名字就知道出问题了)6、开机有一些注册表…

阿里云 人工智能与机器学习

阿里云的 人工智能(AI)与机器学习(ML) 服务为企业提供了全面的AI解决方案,帮助用户在多个行业实现数据智能化,提升决策效率,推动业务创新。阿里云通过先进的技术和丰富的工具,支持用…