深入了解软件设计模式:创新应用与优化代码结构
前言
在软件开发中,设计模式被广泛应用,通常分为三大类:创建型、结构型和行为型。这些模式经过时间验证,在解决特定问题和优化代码结构方面发挥了重要作用。本文将详细介绍每一类设计模式,并通过具体实例展示它们的应用场景和优势。
现代软件工程中,使用设计模式是构建高质量、可维护和可扩展软件的关键。设计模式提供了经过验证的解决方案,帮助开发人员有效地应对复杂性和变化。了解不同类型的设计模式不仅有助于提升代码的设计和结构,还能够加深对软件工程原理的理解,从而成为更优秀的软件开发者。
1. 创建型模式
创建型模式关注对象实例化的方法,旨在提供灵活的对象创建机制,以满足不同场景下的需求。
-
工厂模式(Factory Pattern):通过定义一个创建对象的接口,将对象的实例化延迟到其子类,实现了代码的灵活性和可扩展性。例如,一个汽车工厂可以根据客户需求生产不同类型的汽车。
-
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关对象的接口,而无需指定具体类。比如,在一个电子产品制造系统中,抽象工厂可以创建手机、平板和笔记本电脑等产品。
-
单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。典型的应用包括线程池、配置管理器等需要唯一实例的场景。
-
建造者模式(Builder Pattern):将复杂对象的构建过程与其表示分离,使得可以使用相同的构建过程创建不同的表示。例如,在游戏中建造者模式可以用来构建不同类型的角色。
-
原型模式(Prototype Pattern):通过复制现有对象来创建新对象,避免了通过构造函数创建对象时的重复开销。在图形编辑软件中,可以使用原型模式复制和修改复杂的图形对象。
2. 结构型模式
结构型模式关注如何组合类和对象形成更大的结构,以解决系统结构复杂性和提高代码复用性。
-
适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。例如,将不同格式的数据转换为统一格式供系统使用。
-
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们可以独立地变化。在操作系统中,桥接模式可以将不同的文件系统接口与文件系统实现分离开来。
-
装饰者模式(Decorator Pattern):动态地给一个对象添加额外的职责,比生成子类更为灵活。例如,在咖啡店中,顾客可以根据个人口味选择不同的咖啡调料,装饰者模式可以动态添加这些调料。
-
外观模式(Facade Pattern):为复杂子系统提供一个简化的接口,客户端通过外观接口访问系统,而不需要了解系统内部的复杂结构。在电子商务系统中,外观模式可以隐藏订单处理、库存管理等复杂业务流程。
-
享元模式(Flyweight Pattern):通过共享技术有效地支持大量细粒度的对象,以节省内存和提高性能。例如,在文本编辑器中,享元模式可以共享相同的字体和颜色对象,减少内存占用。
-
组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次关系,使得客户端可以统一处理单个对象和组合对象。在文件系统中,组合模式可以用来表示文件夹和文件的关系。
3. 行为型模式
行为型模式关注对象之间的通信和职责分配,以提高系统的灵活性和可扩展性。
-
模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。在游戏开发中,模板方法模式可以定义游戏角色的行为流程。
-
策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,并使它们可以相互替换。例如,电商平台可以根据不同的支付策略实现多种支付方式。
-
观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖它的对象都得到通知并自动更新。在股票市场软件中,观察者模式可以实现股票价格实时更新。
-
迭代器模式(Iterator Pattern):提供一种顺序访问集合对象元素的方法,而不需要暴露其内部表示。在社交网络中,迭代器模式可以用来遍历用户的好友列表。
-
责任链模式(Chain of Responsibility Pattern):将请求的发送者和接收者解耦,通过多个对象对请求进行处理,直到找到合适的处理者。例如,在客服系统中,可以使用责任链模式处理客户问题。
-
命令模式(Command Pattern):将请求封装为一个对象,从而允许客户端参数化请求并将其排队、记录请求日志,或者支持撤销操作。在智能家居系统中,命令模式可以实现对家电设备的远程控制。
-
状态模式(State Pattern):允许对象在内部状态发生改变时改变其行为。例如,交通信号灯根据不同的状态(红灯、绿灯、黄灯)改变交通流向。
-
访问者模式(Visitor Pattern):在不改变元素类的前提下,定义作用于这些元素的新操作。在图形设计软件中,访问者模式可以用来实现对不同图形元素的不同操作,如计算面积或生成SVG。
总结
本文详细介绍了创建型、结构型和行为型设计模式,每种模式都有其独特的应用场景和优势。通过合理应用设计模式,开发人员能够提高代码的质量、可维护性和可扩展性,从而更加高效地应对复杂的软件开发挑战。选择适合项目需求的设计模式,是每个软件开发者在提升技能和解决实际问题中的关键一步。
相关文章:
深入了解软件设计模式:创新应用与优化代码结构
前言 在软件开发中,设计模式被广泛应用,通常分为三大类:创建型、结构型和行为型。这些模式经过时间验证,在解决特定问题和优化代码结构方面发挥了重要作用。本文将详细介绍每一类设计模式,并通过具体实例展示它们的应…...

android studio 模拟器文件查找
android studio 模拟器文件查找 使用安卓模拟器下载文件后通常无法在系统硬盘上找到下载的文件,安卓 studio studio 其实提供了文件浏览工具,找到后可以直接使用 Android studio 打开 打开 Android studioview 菜单view > Tool Windows > Device…...

【科普】半导体制造过程的步骤、技术、流程
在这篇文章中,我们将学习基本的半导体制造过程。为了将晶圆转化为半导体芯片,它需要经历一系列复杂的制造过程,包括氧化、光刻、刻蚀、沉积、离子注入、金属布线、电气检测和封装等。 基本的半导体制造过程 1.晶圆(Wafer…...
c89、c99、c11
C99 标准开始引入了 // 单行注释。在此之前,C语言只支持 /* ... */ 多行注释。 具体说明: // 单行注释:在C99标准(ISO/IEC 9899:1999)引入之前,C语言中没有单行注释。C99标准借鉴了C的注释风格࿰…...

【网络安全的神秘世界】已解决burpsuite报错Failed to start proxy service on 127.0.0.1:8080
🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 解决burpsuite无法在 127.0.0.1:8080 上启动代理服务端口被占用以及抓不到本地包的问题 Burpsuite无法启动proxy…...

【C#】使用数字和时间方法ToString()格式化输出字符串显示
在C#编程项目开发中,几乎所有对象都有格式化字符串方法,其中常见的是数字和时间的格式化输出多少不一样,按实际需要而定吧,现记录如下,以后会用得上。 文章目录 数字格式化时间格式化 数字格式化 例如,保留…...
Mac系统主机名变为bogon的解决方案
如题 在使用Mac操作系统时,您可能会遇到一个有趣且略显困扰的问题:终端中显示的主机名突然变成了“bogon”。这不仅让人困惑,还可能给日常操作带来不便。本文旨在提供一种简便的解决方法,帮助您将主机名恢复为正常状态。 什么是…...

行列式和矩阵的区别
目录 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 同济大学数学系. 工程数学…...
MATLAB复习
MATLAB常用的标点符号 空格 变量分隔符 矩阵一行中各元素间的分隔符 程序语句关键词分隔符 逗号,分隔显示计算结果的各语句 变量分隔符 矩阵中一行各元素的分隔符点号.数值中的小数点 结构数组的域访问符分号;分隔不想显示计算结果的各语句 矩阵行与行的…...
Android11 动态权限申请
1、单个权限检查及申请 private void checkSinglePermission(){// 在需要的地方,如Activity中if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)! PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,…...

线性卷积(相关)和圆周卷积(相关)以及FFT之间的关系(AEC举例)
时域自适应滤波算法中的线性卷积和线性相关运算量较大,导致计算复杂度升高,我们更愿意把这两个信号变换到频域,通过频域相乘的方式来取代时域复杂度相当高的卷积或相关运算。 预备知识:线性卷积(相关)和圆…...

AMD平台,5600X+6650XT,虚拟机安装macOS 14(2024年6月)
AMD平台安装macOS 14的麻烦,要比Intel平台多的多,由于macOS从13开始,对CPU寄存器的读取进行了改变,导致AMD平台只要安装完macOS 13及以后版本,开机后就报五国语言错误,不断重启。改vmx文件,被证…...

Spring源码之手写DI
Spring源码之手写DI 我们来回顾一下前面手写IOC的内容。 一、DI介绍 DI(Dependency injection)依赖注入。对象之间的依赖由容器在运行期决定,即容器动态的将某个依赖注入到对象之中。说直白点就是给Bean对象的成员变量赋值。 在这里我们就需要明白几个问题。 1.…...

从零入手人工智能(5)—— 决策树
1.前言 在上一篇文章《从零入手人工智能(4)—— 逻辑回归》中讲述了逻辑回归这个分类算法,今天我们的主角是决策树。决策树和逻辑回归这两种算法都属于分类算法,以下是决策树和逻辑回归的相同点: 分类任务࿱…...
go语言:两协程并发交替打印数字和字母(代码逐行注释)
要求: 并发两协程交替打印数字和字母。一个协程打印数字,一个协程打印字母。 输出: 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 思路: 两个 channel 控制两个协程进行交替打印。sync.WaitG…...

TWM论文阅读笔记
这是ICLR2023的一篇world model论文,用transformer来做世界模型的sequence prediction。文章贡献是transformer-based world model(不同于以往的如transdreamer的world model,本文的transformer-based world model在inference 的时候可以丢掉…...

探索ChatTTS项目:高效的文字转语音解决方案
文章目录 📖 介绍 📖📒 ChatTTS 📒📝 项目介绍📝 项目亮点📝 UI 🎈 项目地址 🎈 📖 介绍 📖 在AI技术迅速发展的今天,文本到语音&…...
[Django学习]Q对象实现多字段模糊搜索
一、应用场景 假设我们现在有一个客房系统,前端界面上展示出来了所有客房的所有信息。用户通过客房的价格、面积、人数等对客房进行模糊搜索,如检索出价格在50到100元之间的客房,同时检索面积在20平方米到30平方米之间的客房,此时后端可以借助…...

transdreamer 论文阅读笔记
这篇文章是对dreamer系列的改进,是一篇world model 的论文改进点在于,dreamer用的是循环神经网络,本文想把它改成transformer,并且希望能利用transformer实现并行训练。改成transformer的话有个地方要改掉,dreamer用ht…...

AIGC技术的发展现状与未来趋势探讨
AIGC技术的发展现状与未来趋势探讨 随着人工智能(AI)技术的迅猛发展,AI生成内容(AI-Generated Content,AIGC)成为了一项颠覆性的技术,它能够自动生成文本、图像、音频和视频等多种内容。本文将…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...