设计模式概览

news2024/10/21 23:30:44

设计模式是一种解决常见编程问题的经验总结,提供了代码的可重用性、可扩展性和可维护性。常见的设计模式有23个,主要分为三大类:创建型模式、结构型模式和行为型模式。下面是这三类设计模式的详细分类和讲解:

在这里插入图片描述

一、创建型模式

创建型模式主要处理对象的创建过程,提供了不同的方式来控制对象的创建,以提高灵活性和可复用性。

1. 单例模式(Singleton Pattern)

保证一个类仅有一个实例,并提供全局访问点。

  • 使用场景:资源管理器、日志系统、数据库连接池等。
  • 优点:减少内存开销,避免多次创建实例。
  • 缺点:容易造成全局状态,使得代码难以测试。
2. 工厂方法模式(Factory Method Pattern)

定义一个用于创建对象的接口,但让子类决定要实例化的类。
-使用场景:当一个类不知道它所需要创建的对象的具体类型时。
-优点:提高灵活性,使代码依赖于抽象而非具体类。
-缺点:增加类的数量,增加系统复杂性。

3. 抽象工厂模式(Abstract Factory Pattern)

提供一个接口,用于创建一系列相关或依赖的对象,而无需指定具体的类。
-使用场景:当系统需要与多个相关联的产品族打交道时。
-优点:易于扩展,满足"开放-关闭"原则。
-缺点:复杂度较高,扩展困难。

4. 建造者模式(Builder Pattern)

将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

  • 使用场景:构建复杂对象时,如HTML生成器、SQL查询构建器等。
  • 优点:使得创建过程更加清晰,可拆分步骤。
  • 缺点:产品变化多时,建造者类可能会变得庞大。
5. 原型模式(Prototype Pattern)

通过复制已有的实例来创建新对象,而不是通过实例化类来创建。

  • 使用场景:当对象的创建开销较大,且需要大量相似对象时。
  • 优点:避免重复初始化。
  • 缺点:深拷贝和浅拷贝的处理可能较复杂。

二、结构型模式

结构型模式关注类和对象的组合,主要目的是通过继承或组合的方式来获得新的功能。

1. 适配器模式(Adapter Pattern)

将一个类的接口转换成客户希望的另外一个接口,使得原本接口不兼容的类可以一起工作。

  • 使用场景:当现有类的接口与需求不符时,如将老系统接口适配新系统。
  • 优点:复用已有代码,增强代码兼容性。
  • 缺点:增加了系统的复杂性。
2. 桥接模式(Bridge Pattern)

将抽象部分与实现部分分离,使它们可以独立变化。

  • 使用场景:当一个类具有多个维度的变化时(如设备和操作系统)。
  • 优点:可以独立扩展抽象和实现部分。
  • 缺点:增加了系统的理解和设计难度。
3. 组合模式(Composite Pattern)

将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

  • 使用场景:当系统需要表示树形结构时,如文件系统。
  • 优点:简化了客户端代码。
  • 缺点:使得设计更加复杂。
4. 装饰器模式(Decorator Pattern)

动态地给对象添加新的功能,而不改变其结构。

  • 使用场景:需要动态地为对象增加功能,如给窗体增加滚动条。
  • 优点:灵活性高,不改变原有类的情况下扩展功能。
  • 缺点:增加了系统的复杂性。
5. 外观模式(Facade Pattern)

提供一个统一的接口,来访问子系统中的一群接口,使得子系统更加容易使用。

  • 使用场景:当系统复杂,且需要对外提供简化的接口时。
  • 优点:简化了复杂系统的调用,降低了客户对子系统的依赖。
  • 缺点:可能掩盖了子系统的真正复杂性。
6. 享元模式(Flyweight Pattern)

通过共享已经存在的对象,减少创建对象的数量,从而减少内存开销。

  • 使用场景:大量相似对象存在,且内存占用大时,如文本编辑器中的字符对象。
  • 优点:减少内存消耗,提高性能。
  • 缺点:增加了系统复杂性。
7. 代理模式(Proxy Pattern)

为其他对象提供一种代理,以控制对这个对象的访问。

  • 使用场景:远程代理、虚拟代理、保护代理等场景。
  • 优点:控制访问权限,降低开销。
  • 缺点:引入了间接性,增加了复杂度。

三、行为型模式

行为型模式关注对象之间的通信和协作,目的是使对象之间的交互更加灵活。

1. 责任链模式(Chain of Responsibility Pattern)

将请求沿着处理链传递,直到有一个对象处理它。

  • 使用场景:需要多个对象处理请求,但处理者不确定时。
  • 优点:降低了请求发送者和接受者之间的耦合度。
  • 缺点:处理链过长时,性能可能受到影响。
2. 命令模式(Command Pattern)

将请求封装成对象,以便可以使用不同的请求、队列或日志来参数化其他对象。

  • 使用场景:实现撤销操作、事务管理等。
  • 优点:解耦请求发送者和接收者。
  • 缺点:增加了系统的复杂性。
3. 解释器模式(Interpreter Pattern)

给定一种语言,定义它的文法表示,并定义一个解释器来解释这些表达式。

  • 使用场景:编译器、规则引擎等。
  • 优点:灵活,易于扩展文法。
  • 缺点:文法复杂时,难以维护。
4. 迭代器模式(Iterator Pattern)

提供一种方法顺序访问一个集合对象中的各个元素,而不暴露其内部表示。

  • 使用场景:遍历集合对象时。
  • 优点:使得集合遍历统一。
  • 缺点:额外的开销。
5. 中介者模式(Mediator Pattern)

通过一个中介者对象来封装对象之间的交互,使得对象不需要显式地相互引用,降低了耦合度。

  • 使用场景:多个对象间交互复杂时,如GUI组件之间的通信。
  • 优点:减少了对象之间的依赖关系。
  • 缺点:中介者本身可能会变得复杂。
6. 备忘录模式(Memento Pattern)

在不破坏封装的前提下,捕获对象的内部状态,以便在未来可以恢复它。

  • 使用场景:实现撤销操作时。
  • 优点:实现了对象状态的快照。
  • 缺点:可能导致内存开销大。
7. 观察者模式(Observer Pattern)

定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知并自动更新。

  • 使用场景:事件监听机制,GUI框架等。
  • 优点:松散耦合,灵活性高。
  • 缺点:如果观察者太多,通知可能会导致性能问题。
8. 状态模式(State Pattern)

允许对象在其内部状态发生改变时改变其行为,看起来像是修改了它的类。

  • 使用场景:对象的行为随状态变化而变化时,如状态机。
  • 优点:将状态与行为封装在一个类中,减少条件语句。
  • 缺点:状态较多时,类的数量可能会增加。
9. 策略模式(Strategy Pattern)

定义一系列算法,并将它们封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的客户。

  • 使用场景:当算法有多种实现方式
  • 优点:符合“开放-关闭”原则,易于扩展。
  • 缺点:客户端需要了解不同的策略类。
10. 模板方法模式(Template Method Pattern)

定义算法的骨架,并允许子类在不改变算法结构的情况下重新定义某些步骤。

  • 使用场景:固定算法流程,但部分步骤需要可扩展时。
  • 优点:复用代码,易于维护。
  • 缺点:灵活性受限。
11. 访问者模式(Visitor Pattern)

访问者模式用于将数据结构与操作解耦。通过在访问者中定义新的操作,可以避免修改数据结构。该模式允许你在不改变元素类的前提下,定义作用于这些类的新操作。

  • 使用场景:需要对一个对象结构中的元素执行许多不同的操作,但又不希望因为频繁增加新操作而修改这些类时。
    结构:访问者模式有两个关键角色:
  • 优点:增加新的操作非常简单,只需增加新的访问者类即可。符合单一职责原则,将不同操作的实现与对象结构的实现分离。
  • 缺点:如果对象结构经常改变,添加新元素会比较麻烦,因为所有的访问者类都需要更新。

这些设计模式是软件开发中常用的工具,通过合理的使用可以显著提高系统的灵活性、扩展性和可维护性。在实际开发中,选择合适的模式需要根据具体问题场景来判断。

参考文档
https://medium.com/nerd-for-tech/design-patterns-introduction-7022b8d384c6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220367.html

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

相关文章

进入 Searing-66 火焰星球:第一周游戏指南

Alpha 第四季已开启,穿越火焰星球 Searing-66,带你开启火热征程。准备好勇闯炙热的沙漠,那里有无情的高温和无情的挑战在等待着你。从高风险的烹饪对决到炙热的冒险,Searing-66 将把你的耐力推向极限。带上充足的水,天…

Fusion创建一个简单的api脚本文件

我的Fusion版本:Fusion 2.0.20476 x86_64 脚本模块在实用程序->附加模型->脚本和附加模块,快捷键为shifts 里面有一些演示脚本,可以直接使用 也可以自己创建一个新的脚本 创建的脚本在此处—— 选择脚本文件,点击编辑&a…

小新学习Docker之Ansible 的脚本 --- playbook 剧本

一、playbook 剧本简介 playbooks 本身由以下各部分组成: (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 (2)Variables:变量 (3…

Linux系统基础-动静态库

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux系统基础-动态库和静态库 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 动…

如何在 Jupyter Notebook 执行和学习 SQL 语句(下)—— 进阶版题目综合(多表连接,窗口函数,子查询等等)

这是我收藏的一些相关的题目,其中包含基本操作(如创建表、插入数据)(注意一般企业也不会让删除数据啥的,毕竟刚进去哪会让对人家数据库做什么操作,我是实习的时候参加了数据仓库的建设,插了一些…

498.对角线遍历

目录 题目解法代码说明:输出: 如何确定起始点?解释一下max(0,d−m1)是什么意思? 如何遍历对角线?.push_back是怎么用的? 题目 给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序&#xf…

JNA调用c++动态库返回数据

jna学习网站 JNA Examples 1、返回String, pch.h头文件 // pch.h: 这是预编译标头文件。 // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 // 但是,如果此处…

软考攻略/超详细/系统集成项目管理工程师/基础知识分享18

6.5数据分析及应用 6.5.1 数据集成(掌握) 数据集成就是将驻留在不同数据源中的数据进行整合,向用户提供统一的数据视图,使得用户能以透明的方式访问数据。 WebServices技术是一个面向访问的分布式计算模型,它的本质是…

Nature 正刊丨空间蛋白质组学确定JAKi是一种致命皮肤病的治疗方法

01摘要 中毒性表皮坏死松解症(TEN)是一种由常见药物引发的致命药物性皮肤反应,是一个新出现的公共卫生问题1,2,3。TEN患者会因角质形成细胞死亡而发生严重和突然的表皮脱离。尽管已经提出了驱动角质形成细胞死亡的分子机制,但主要…

10.21 IO进程直接的通信

1、用消息队列实现两个进程直接的通信 先输入的代码 #include<myhead.h> //定义消息列队的结构体 struct msgbuf {long mtype; //消息类型char mtext[1024]; //消息正文 };//宏定义正文的大小 #define MSGSZ (sizeof(struct msgbuf) - sizeof(long))//定义回收僵尸信号…

Linux第一讲:Linux基本指令

Linux第一讲&#xff1a;Linux基本指令 1.Linux发展历史2.先快速了解一些指令3.指令 -- ls3.1知识点1 -- 文件属性3.1.1详细解析ls指令3.1.1.1 ls3.1.1.2 ls -l 、ls -a3.1.1.2.1 ls -l3.1.1.2.2 ls -a3.1.1.2.3 ls -la 3.1.1.3其它指令 3.2知识点2 -- 什么是.和..3.3知识点3 -…

手写模拟Spring的基本功能

文章目录 1. Spring的基本功能2. 容器启动 容器启动&#xff0c;即创建容器对象并赋予配置对象3. BeanDefinition扫描4. Bean的生命周期5. 单例Bean与多例Bean6. 依赖注入7. AOP8. Aware 回调9. 初始化10. BeanPostProcessor附录&#xff1a; 1. Spring的基本功能 2. 容器启动 …

【鸡翅Club】项目启动

一、项目背景 这是一个 C端的社区项目&#xff0c;有博客、交流&#xff0c;面试学习&#xff0c;练题等模块。 项目的背景主要是我们想要通过面试题的分类&#xff0c;难度&#xff0c;打标&#xff0c;来评估员工的技术能力。同时在我们公司招聘季的时候&#xff0c;极大的…

mingw64的Windows安装及配置教程gcc、g++等

mingw64.rar 链接&#xff1a;https://pan.baidu.com/s/18YrDRyi5NHtqnTwhJG6PuA 提取码&#xff1a;pbli &#xff08;免费永久有效&#xff0c;免安装&#xff0c;解压后配置环境变量即可使用&#xff09; 1 下载 解压后随便放到一个地方&#xff1a; 复制“bin”路径&am…

SpringCloudAlibaba[Nacos]注册配置中心注册与发现服务

Nacos的全称是Dynamic Naming and Configuration Service&#xff0c;Na为naming/nameServer即注册中心,co为configuration即注册中心&#xff0c;service是指该注册/配置中心都是以服务为核心。是阿里巴巴开源易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nac…

安装vue发生异常:npm ERR! the command again as root/Administrator.

一、异常 npm ERR! The operation was rejected by your operating system. npm ERR! Its possible that the file was already in use (by a text editor or antivirus), npm ERR! or that you lack permissions to access it. npm ERR! npm ERR! If you believe this might b…

【LeetCode:910. 最小差值 II + 模拟 + 思维】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

html,css,js实现Upload 上传

实现效果&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docum…

基于Multisim的汽车尾灯控制电路设计与仿真

假设汽车尾部左右量测各有3个指示灯&#xff08;用发光二极管模拟&#xff09;1. 汽车正常运行时指示灯全灭&#xff1b;2.右转弯时&#xff0c;右侧3个指示灯按右循环顺序点亮&#xff1b;.3. 左转弯时&#xff0c;左侧3个指示灯按左循环顺序点亮&#xff1b;4.临时刹车时所有…

【C语言刷力扣】910.最小差值 ||

题目&#xff1a; 解题思路; 由于需要对数组中的每一个进行 k 或 -k 的操作&#xff0c;这时要求最小差值&#xff0c;即对较大的数 -k 对较小的数 k。 需要先对数组进行排序&#xff0c;再枚举对元素的操作。 对 nums[0] 到 nums[i - 1] 的数进行 k对 nums[i] 到 nums[numsS…