【设计模式-2】23 种设计模式的分类和功能
在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了 23 种设计模式。这些模式可以从两个维度进行分类:根据目的和根据作用范围。本文将详细探讨这两种分类方式,并逐一介绍每种模式的功能和应用场景。
1. 根据目的分类
根据设计模式的目的,GoF 将 23 种模式分为三大类:创建型模式、结构型模式和行为型模式。
1.1 创建型模式(Creational Patterns)
- 目的:关注对象的创建过程,旨在将对象的创建与使用分离。
- 模式:
- 单例模式(Singleton)
- 功能:确保一个类只有一个实例,并提供全局访问点。
- 应用场景:数据库连接池、日志管理器。
- 工厂方法模式(Factory Method)
- 功能:定义一个创建对象的接口,由子类决定实例化哪个类。
- 应用场景:框架中的对象创建,如 Spring 的 Bean 工厂。
- 抽象工厂模式(Abstract Factory)
- 功能:提供一个接口,用于创建相关或依赖对象的家族。
- 应用场景:跨平台 UI 组件库。
- 建造者模式(Builder)
- 功能:将复杂对象的构建与其表示分离。
- 应用场景:构建复杂对象,如 HTML 文档。
- 原型模式(Prototype)
- 功能:通过复制现有对象来创建新对象。
- 应用场景:游戏中的角色复制。
- 单例模式(Singleton)
1.2 结构型模式(Structural Patterns)
-
目的:关注类和对象的组合,旨在形成更大的结构。
-
模式:
- 适配器模式(Adapter)
- 功能:将一个类的接口转换成客户端期望的另一个接口。
- 应用场景:整合不兼容的接口。
- 装饰器模式(Decorator)
- 功能:动态地为对象添加额外的职责。
- 应用场景:Java I/O 流。
- 代理模式(Proxy)
- 功能:为其他对象提供一个代理,以控制对其访问。
- 应用场景:延迟加载、权限控制。
- 组合模式(Composite)
- 功能:将对象组合成树形结构以表示“部分-整体”关系。
- 应用场景:文件系统、UI 组件树。
- 桥接模式(Bridge)
- 功能:将抽象部分与实现部分分离。
- 应用场景:多维度变化的系统,如不同形状和颜色的图形。
- 外观模式(Facade)
- 功能:为子系统中的一组接口提供一个统一的接口。
- 应用场景:简化复杂系统的调用。
- 享元模式(Flyweight)
- 功能:通过共享技术有效地支持大量细粒度对象。
- 应用场景:文本编辑器中的字符对象。
- 适配器模式(Adapter)
1.3 行为型模式(Behavioral Patterns)
-
目的:关注对象之间的职责分配和通信方式。
-
模式:
- 观察者模式(Observer)
- 功能:定义对象间的一对多依赖关系。
- 应用场景:事件驱动系统,如 GUI 框架中的事件监听。
- 策略模式(Strategy)
- 功能:定义一系列算法,使它们可以互相替换。
- 应用场景:多种算法或策略的场景,如排序算法。
- 命令模式(Command)
- 功能:将请求封装为对象。
- 应用场景:撤销操作、任务队列。
- 状态模式(State)
- 功能:允许对象在其内部状态改变时改变其行为。
- 应用场景:状态机、游戏角色的行为变化。
- 模板方法模式(Template Method)
- 功能:定义一个算法的骨架,将某些步骤延迟到子类中实现。
- 应用场景:框架中的钩子方法。
- 迭代器模式(Iterator)
- 功能:提供一种方法顺序访问一个聚合对象中的各个元素。
- 应用场景:集合类的遍历。
- 责任链模式(Chain of Responsibility)
- 功能:将请求的发送者和接收者解耦。
- 应用场景:审批流程、异常处理链。
- 访问者模式(Visitor)
- 功能:将算法与对象结构分离。
- 应用场景:编译器中的语法树遍历。
- 中介者模式(Mediator)
- 功能:定义一个中介对象来封装一系列对象之间的交互。
- 应用场景:聊天室、事件总线。
- 备忘录模式(Memento)
- 功能:捕获并外部化一个对象的内部状态。
- 应用场景:撤销操作、游戏存档。
- 解释器模式(Interpreter)
- 功能:定义一个语言的文法,并定义一个解释器来解释该语言中的句子。
- 应用场景:编译器、规则引擎。
- 观察者模式(Observer)
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 种设计模式从不同角度解决了软件设计中的常见问题。通过根据目的和根据作用范围两种分类方式,我们可以更清晰地理解这些模式的核心思想及其适用场景。无论是创建型、结构型还是行为型模式,亦或是类模式和对象模式,它们都为开发人员提供了强大的工具箱,帮助构建灵活、可维护和可扩展的软件系统。
相关文章:
【设计模式-2】23 种设计模式的分类和功能
在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了…...
记录一下Coding一直不能clone
配置 下载git客户端,进行配置 git config --list user.name姓名全称 user.emailIAM_xxxxxx.com ,这个就是你的邮箱地址 user.signingkey 注册coding平台的密码 一般不需要配置公钥私钥 下载TortoiseGit,配置这几个参数 配置凭据管理器 注意 这里用户名是…...
Backend - C# EF Core 执行迁移 Migrate
目录 一、创建Postgre数据库 二、安装包 (一)查看是否存在该安装包 (二)安装所需包 三、执行迁移命令 1. 作用 2. 操作位置 3. 执行(针对visual studio) 查看迁移功能的常用命令: 查看…...
检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?
论文地址:https://arxiv.org/pdf/2403.05313 Github地址:https://github.com/CraftJarvis/RAT 想象一下,一个人工智能助手可以像莎士比亚一样写作,像专家一样推理。这听起来很了不起,对吧?但是࿰…...
第四届电子信息与通信工程国际学术会议(EICE 2025)
第四届电子信息与通信工程国际学术会议(EICE 2025)定于2025年1月10日至12日在中国广州举行。大会交流全球相关领域科技学术最新发展趋势,链接重点领域国内外顶尖、活跃、最新学术资源,通过经验分享和智慧碰撞,推动科研…...
Hbuilder ios 离线打包sdk版本4.36,HbuilderX 4.36生成打包资源 问题记录
1、打包文档地址https://nativesupport.dcloud.net.cn/AppDocs/usesdk/ios.html#%E9%85%8D%E7%BD%AE%E5%BA%94%E7%94%A8%E7%89%88%E6%9C%AC%E5%8F%B7 2、配置应用图标 如果没有appicon文件,此时找到 Assets.xcassets 或者 Images.xcassets(看你sdk引入的启动文件中…...
HarmonyOS开发:传参方式
一、父子组件传参 1、父传子(Prop方式) 父组件代码 Entry Component struct ParentComponent {State parentMessage: string Hello from Parent;build() {Column() {ChildComponent({ message: this.parentMessage });}} } 子组件代码 Component s…...
Tomcat(116) 如何在Tomcat中解决缓存问题?
在Tomcat中解决缓存问题涉及多个方面的优化和处理,包括优化缓存配置、监控缓存状态、处理缓存失效和一致性问题等。以下是详细的步骤和代码示例,帮助你在Tomcat中解决缓存问题。 1. 优化缓存配置 Tomcat内置了一些静态资源的缓存机制,可以通…...
2.STM32F407ZGT6-外部中断
参考: 1.正点原子。 前言: MCU最重要的一个领域–中断。总结下嵌套向量和外部中断的概念。达到: 1.NVIC是什么,了解中断的整体管理理念。 2.中断里面最简单的外部中断,怎么配置处理。 3.使用STM32CubeMX配置外部中断的…...
C# 之某度协议登录,JS逆向,手机号绑定,获取CK
.NET兼职社区 .NET兼职社区 .NET兼职社区 .NET兼职社区 有需要指导,请私信我留言V或者去社区找客服。...
0基础学前端-----CSS DAY12
视频参考:B站Pink老师 今天是CSS学习的第十二天,今天开始的笔记对应Pink老师课程中的CSS第七天的内容。 本节重点:CSS高级技巧 本章目录 本节目标1. 精灵图1.1 为什么需要精灵图1.2 精灵图使用案例:拼出自己的名字 2. 字体图标2.…...
STM32——系统滴答定时器(SysTick寄存器详解)
文章目录 1.SysTick简介2.工作原理3.SysTick寄存器4.代码延时逻辑5.附上整体代码6.一些重要解释 1.SysTick简介 Cortex-M处理器内集成了一个小型的名为SysTick(系统节拍)的定时器,它属于NVIC的一部分,且可以产生 SysTick异常(异常类型#15)。SysTick为简单的向下计数的24位计数…...
HTML5 弹跳动画(Bounce Animation)详解
HTML5 弹跳动画(Bounce Animation)详解 弹跳动画是一种动态效果,使元素在出现或消失时看起来像是在跳动。这种效果可以通过 CSS 动画或 JavaScript 来实现,增强用户体验。 1. 使用 CSS 实现弹跳动画 可以使用 CSS 的 keyframes…...
Python 模拟登录网页,或者编写爬虫时模拟登录的详细总结
参考 Python模拟登陆网页的三种方法_python模拟登录-CSDN博客 python-模拟登陆多种方法总结_python模拟登录-CSDN博客 Python模拟登录的几种方法_实现模拟登录的方式有哪些?-CSDN博客 Python爬虫——模拟登录_python 模拟登录-CSDN博客 Python3 爬虫 模拟登录_python模拟登录网…...
若依框架简介
若依(RuoYi)框架是一个基于Java语言的后台管理系统快速开发框架,它结合了多种前端和后端技术,提供了高效的开发工具。以下是对若依框架的详细解析: 一、技术架构 后端:若依框架后端采用了Spring Boot、My…...
Linux中rsync命令使用
一、rsync简介 rsync 是一种高效的文件复制和同步工具,常用于在本地或远程计算机之间同步文件和目录 主要特性增量同步:rsync 会检测源和目标文件之间的差异,只传输发生变化的部分,而不是重新传输整个文件。这样就能有效减少数据…...
opencv 学习(1)
文章目录 opencv导学部分opencv的作用ffmpeg和 opencv的关系opencv的未来 计算机视觉是什么? opencv导学部分 opencv的作用 1 : 目标识别 人脸识别 车辆识别 2 : 自动驾驶技术 – 计算机视觉 进行车道的检测 3 : 医学图像分析 通过分析光片 来分析人到底得了什么病…...
中高级运维工程师运维面试题(十一)之 Docker
目录 往期回顾前言基础知识1. 什么是 Docker?2. Docker 的核心组件有哪些?3. Docker 镜像和容器有什么区别?4. 什么是 Dockerfile? 高级知识5. 什么是多阶段构建?如何使用?6. Docker 网络有哪些模式&#x…...
Kafka如何实现顺序消费?
Kafka的消息是存储在指定的topic中的某个partition中的。并且一个topic是可以有多个partition的。同一个partition中的消息是有序的,但是跨partition,或者跨topic的消息就是无序的了。 为什么同一个partition的消息是有序的? 因为当生产者向某个parti…...
通过 ulimit 和 sysctl 调整Linux系统性能
目录 一:资源限制管理工具:ulimit1、ulimit 作用介绍2、ulimit 常用选项3、ulimit 配置文件 二:内核参数调整工具:sysctl1、sysctl 作用介绍2、sysctl 常用选项3、sysctl 配置文件 一:资源限制管理工具:uli…...
pandas基础使用
pandas基础使用 基本介绍 类似于字典形式的numpy,可以给它的不同行和不同列进行重命名。 import numpy as np import pandas as pd # 创建一个序列 s pd.Series([1,4,True,np.nan,55.0])创建date format日期矩阵 import numpy as np import pandas as pd dates…...
2024.1.5总结
今日不开心:这周本来想花点时间学习的,没想到全都花在刷视频,外出消费去了。 今日思考: 1.找对象这件事确实不能强求,顺其自然吧,单身和不单身,其实,各有各的利弊。在一次坐地铁的过程中,我一…...
解释一下:运放的输入偏置电流
输入偏置电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…...
Federation机制的实现
1.关闭Hadoop的HDFS和YARN,依次执行“stop-yarn.sh”和“stop-dfs.sh”命令关闭Hadoop的YARN和HDFS。 2.删除3台虚拟机上的临时文件: 3.修改hdfs-site.xml配置文件,进入虚拟机liumengting1的/export/servers/hadoop-3.3.4/etc/hadoop目录&…...
120.Jenkins里的Pipeline Script
目录 1. **Declarative Pipeline** 主要部分 示例 2. **Scripted Pipeline** 主要部分 示例 3. **常用指令和功能** 环境变量 工具管理 文件操作 构建触发器 并行执行 异常处理 用户交互 4.**两种类型的特点** 1. **声明式 Pipeline (Declarative Pipeline)** 中…...
SpringBoot3-整合WebSocket指南
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ SpringBoot3-整合WebSocket指南 1. 什么是WebSocket?2. 环境准备2.1 项目依赖 3. WebSocket配置3.1 WebSocket配置类3.2 自定义WebSocket处理器 4. 控制器5. 前端实现5.…...
【npm依赖包介绍】借助rimraf依赖包,在用npm run build构建项目时,清空dist目录,避免新旧混合
文章目录 背景如何使用附上rimraf的介绍和说明主要作用使用场景安装使用示例异步删除同步删除 参考资料 背景 在npm run build时,一般都会清空项目中已有的dist目录再构建,避免新旧混合。 如何使用 可以简单使用rimraf这个npm依赖包。 目前rimraf的最…...
python学opencv|读取图像(二十四)使用cv2.putText()绘制文字进阶-倾斜文字
【1】引言 前述学习进程中,我们已经掌握了pythonopencv绘制文字的基本技能,相关链接为: python学opencv|读取图像(二十三)使用cv2.putText()绘制文字-CSDN博客 在这里,我们使用不同的字体、线条颜色和线…...
【简博士统计学习方法】第1章:3. 统计学习方法的三要素
3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间(Hypothesis Space):所有可能的条件概率分布或决策函数,用 F \mathcal{F} F表示。 若定义为决策函数的集合: F { f ∣ Y f ( X ) } \mathcal{F…...
“AI智慧语言训练系统:让语言学习变得更简单有趣
大家好,我是你们的老朋友,一个热衷于探讨科技与教育结合的产品经理。今天,我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音,让我们一起来揭开它的神秘面纱吧࿰…...
机器学习笔记 - 单幅图像深度估计的最新技术
1、深度估计简述 单眼深度估计是一项计算机视觉任务,AI 模型从单个图像中预测场景的深度信息。模型估计场景中对象从一个照相机视点的距离。单目深度估计已广泛用于自动驾驶、机器人等领域。深度估计被认为是最困难的计算机视觉任务之一,因为它要求模型理解对象及其深度信息之…...
洛谷:P1540 [NOIP2010 提高组] 机器翻译
[NOIP2010 提高组] 机器翻译 题目背景 NOIP2010 提高组 T1 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于…...
2025第2周 | JavaScript中的函数的参数默认值和剩余参数
目录 1. 函数的默认值1.1 ES5的时候默认值写法1.2 es6的默认值1.3 babel转换之后1.4 有默认值的参数建议放到最后1.5 有默认值的函数length属性 2. 参数为对象时默认值及解构2.1 默认值和解构一起使用2.2 默认值为一个空对象 3. 剩余参数3.1 剩余参数必须放到最后3.2 剩余参数和…...
Unity学习之UGUI(三)
十二、Slider 1、作用 Slider是滑动条组件,是UGUI中用于处理滑动条相关交互的关键组件 创建Slider默认包括4个对象 父对象:Slider组件依附的对象 子对象:背景图,进度图,滑动块三组对象 2、主要参数 3、代码控制 voi…...
分享3个国内使用正版GPT的网站【亲测有效!2025最新】
1. molica 传送入口:https://ai-to.cn/url/?umolica 2. 多帮AI 传送入口:https://aigc.openaicloud.cn?inVitecodeMYAAGGKXVK 3. 厉害猫 传送入口:https://ai-to.cn/url/?ulihaimao...
ffmpeg-avio实战:打开本地文件或者网络直播流dome
使用ffmpeg打开打开本地文件或者网络直播流的一个小dome。流程产靠ffmpeg4.x系列的解码流程-CSDN博客 #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavformat/avio.h> #include <libavutil/file.h> #include &l…...
三维管线管网自动化建模工具MagicPipe3D V3.6.0
经纬管网建模系统MagicPipe3D,本地离线参数化构建地下管网三维模型(包括管道、接头、附属设施等),输出标准3DTiles、Obj模型等格式,支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析。欢迎…...
设计基于检索增强生成的个性化语言模型(RAG-based LLM)
设计基于检索增强生成的个性化语言模型(RAG-based LLM) 引言 在当今快速发展的自然语言处理技术中,生成式预训练模型(LLM)对个性化和可靠结果的需求不断增加。为了满足这种需求,基于检索增强生成…...
Oracle Dataguard(主库为单节点)配置详解(5):使用 rman 复制技术(DUPLICATE)同步主库到备库
Oracle Dataguard(主库为单节点)配置详解(5):使用 rman 复制技术(DUPLICATE)同步主库到备库 目录 Oracle Dataguard(主库为单节点)配置详解(5)&am…...
119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR
目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1:jenkins中如何配置npm的源 提问2:jenkins pipeline 类型为pipeline script from SCM时,如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…...
回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测
回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测 目录 回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、极限学习机(ELM) 极限学习机是一种单层前馈神经网络,具有训练速…...
服务器漏洞修复解决方案
漏洞1、远程桌面授权服务启用检测【原理扫描】 Windows Remote Desktop Licensing Service is running: Get Server version: 0x60000604 1、解决方案:建议禁用相关服务避免目标被利用 方法一:使用服务管理器 打开“运行”对话框(WinR&am…...
Couldn‘t resolve host name for http://mirrorlist.centos.org
【问题】 在CentOS8执行sudo yum update -y 软件包更新的时候报错 Errors during downloading metadata for repository appstream:- Curl error (6): Couldnt resolve host name for http://mirrorlist.centos.org/?release8-stream&archx86_64&repoAppStream&…...
Vue2:el-table中的文字根据内容改变颜色
想要实现的效果如图,【级别】和【P】列的颜色根据文字内容变化 1、正常创建表格 <template><el-table:data="tableData"style="width: 100%"><el-table-column prop="id" label="ID"/> <el-table-column …...
C++静态变量的使用方法?C++静态变量占用内存情况?拷贝构造函数会拷贝哪些内容?const使用注意
1.静态变量的使用 函数中使用:静态变量初次声明并定义作为初始值,后续再次运行函数,基于上次的结果累加类中:类内声明,类外实现(如声明为const,特殊情况,可以类内直接声明时定义&am…...
Linux初识——基本指令
我们在linux下输入各种指令,其实就相当于在windows中的相关操作,比如双击,新建文件夹等。 以下是相关基本指令基本用法 一.ls(显示当前目录下的所有文件和目录) 那如何显示当前目录(我们所在的位置&…...
python 实现贪心算法(Greedy Algorithm)
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优的选择,希望通过局部最优解达到全局最优解的算法设计方法。以下是使用Python实现贪心算法解决几个经典问题的示例: 1. 活动选择问题(Activity Selection…...
设计形成从业务特点到设计模式的关联
规范和指引在应用架构、数据架构等各架构方向上形成规范性约束指导。同一个决策要点、架构单元在统一的架构原则指导下,会因业务特点差异有不同的实现,经过总结形成了最佳实践。在开展新应用的设计时,根据决策要点以及相关的业务特点…...
Pytorch初学
创建虚拟环境 python控制台,jupyter notebook,python文件运行的差异,后续结合使用三者。 jupter主要可以对代码进行分割单独运行,主要做一些探索性工作。 数据集的常见存储模式 1、以标签命名图像。 2、单独存储图像的地址。 加载数据集…...
【动态重建】时间高斯分层的长体积视频
标题:Representing Long Volumetric Video with Temporal Gaussian Hierarchy 来源:浙江大学 链接:https://zju3dv.github.io/longvolcap/ 文章目录 摘要一、前言二、主要方法2.1 时间高斯分层2.2 高效渲染2.3 层次结构更新2.4 紧凑的外观模型…...