深入了解软件设计模式:创新应用与优化代码结构
前言
在软件开发中,设计模式被广泛应用,通常分为三大类:创建型、结构型和行为型。这些模式经过时间验证,在解决特定问题和优化代码结构方面发挥了重要作用。本文将详细介绍每一类设计模式,并通过具体实例展示它们的应用场景和优势。
现代软件工程中,使用设计模式是构建高质量、可维护和可扩展软件的关键。设计模式提供了经过验证的解决方案,帮助开发人员有效地应对复杂性和变化。了解不同类型的设计模式不仅有助于提升代码的设计和结构,还能够加深对软件工程原理的理解,从而成为更优秀的软件开发者。
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)成为了一项颠覆性的技术,它能够自动生成文本、图像、音频和视频等多种内容。本文将…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果