开发中用到的设计模式

目录

开发中用到的设计模式

工厂模式

设计理念

好处

体现的编程思想

适配器模式

概念

策略模式和适配器模式的区别

选择策略模式而非适配器模式的原因

设计模式的开发原则


开发中用到的设计模式

在开发过程中,常见的设计模式会根据不同的业务场景和需求被广泛使用,以下是一些例子:

  • 单例模式:确保一个类只有一个实例,并提供一个全局访问点。比如在配置管理类、日志记录器等场景中,使用单例模式可以避免多个实例造成的资源浪费和数据不一致问题。
  • 工厂模式:将对象的创建和使用分离,通过一个工厂类来创建对象。在需要创建多种不同类型对象的场景中,如创建不同数据库连接对象时,使用工厂模式可以提高代码的可维护性和可扩展性。
  • 观察者模式:定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。常见于事件处理系统、消息通知系统等。
  • 装饰器模式:动态地给一个对象添加一些额外的职责。在 Java 的 I/O 流体系中就广泛使用了装饰器模式,通过不同的装饰器类可以为基本的输入输出流添加缓冲、加密等功能。

工厂模式

设计理念

工厂模式的核心设计理念是将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象。客户端只需要向工厂类请求所需的对象,而不需要关心对象是如何创建的。这样可以将对象的创建和使用分离,提高代码的可维护性和可扩展性。

好处
  • 解耦对象的创建和使用:客户端代码只需要使用对象,而不需要关心对象的创建细节,降低了代码的耦合度。例如,在一个游戏开发中,不同类型的武器有不同的创建逻辑,使用工厂模式可以将武器的创建逻辑封装在工厂类中,游戏代码只需要从工厂获取武器,而不需要了解每种武器的具体创建过程。
  • 提高代码的可维护性:当对象的创建逻辑发生变化时,只需要修改工厂类的代码,而不需要修改所有使用该对象的客户端代码。比如,如果要修改某个对象的初始化参数,只需要在工厂类中进行修改即可。
  • 便于扩展:当需要添加新的对象类型时,只需要在工厂类中添加相应的创建逻辑,而不需要修改客户端代码。例如,在一个图形绘制系统中,如果要添加一种新的图形类型,只需要在图形工厂类中添加创建该图形的方法。
体现的编程思想

工厂模式体现了面向对象编程中的 “依赖倒置原则” 和 “开闭原则”。依赖倒置原则强调高层模块不应该依赖低层模块,两者都应该依赖抽象。工厂模式通过抽象工厂和具体工厂的设计,使得客户端代码依赖于抽象的工厂接口,而不是具体的工厂实现类。开闭原则要求软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。工厂模式在添加新的对象类型时,只需要扩展工厂类,而不需要修改已有的客户端代码,符合开闭原则。

适配器模式

概念

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式可以让原本不兼容的类能够一起工作。常见的有类适配器和对象适配器两种实现方式。例如,在 Java 中,将一个旧的日志记录类的接口适配成新的日志框架的接口,就可以使用适配器模式。

策略模式和适配器模式的区别
  • 目的不同
    • 策略模式:主要用于定义一系列的算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。例如,在一个电商系统中,对于不同的促销活动(如满减、折扣、赠品等)可以使用策略模式,将每种促销算法封装成一个策略类,客户端可以根据不同的需求选择不同的策略。
    • 适配器模式:主要用于解决接口不兼容的问题,使原本不兼容的类能够协同工作。例如,将一个第三方库的接口适配成自己系统所需的接口。
  • 使用场景不同
    • 策略模式:适用于需要在运行时动态选择不同算法的场景,算法的选择由客户端决定。
    • 适配器模式:适用于需要复用已有的类,但该类的接口与当前系统不兼容的场景。
选择策略模式而非适配器模式的原因

如果需求是在多个可互换的算法中进行动态选择,以满足不同的业务场景,那么策略模式是更合适的选择。而适配器模式主要是解决接口不兼容问题,如果没有接口不兼容的情况,使用策略模式可以更好地实现算法的封装和替换,提高代码的灵活性和可维护性。例如,在一个图像处理系统中,对于不同的图像压缩算法(如 JPEG、PNG 等),使用策略模式可以方便地在不同算法之间切换,而不需要考虑接口不兼容的问题。

设计模式的开发原则

设计模式遵循一些基本的开发原则,这些原则有助于提高代码的可维护性、可扩展性和可复用性,以下是一些常见的原则:

  • 单一职责原则(SRP):一个类应该只有一个引起它变化的原因。也就是说,一个类应该只负责一项职责。例如,一个用户管理类应该只负责用户的增删改查操作,而不应该同时负责用户的权限验证和日志记录等其他职责。
  • 开闭原则(OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。即当需求发生变化时,应该通过扩展代码来实现,而不是修改已有的代码。例如,在一个图形绘制系统中,当需要添加新的图形类型时,应该通过扩展图形类和绘制方法来实现,而不是修改已有的图形绘制代码。
  • 里氏替换原则(LSP):子类可以替换父类并且不会影响程序的正确性。也就是说,子类应该能够完全替代父类,并且不会破坏程序的原有功能。例如,在一个动物类层次结构中,子类猫和狗应该能够替代父类动物,并且不会影响程序的正常运行。
  • 依赖倒置原则(DIP):高层模块不应该依赖低层模块,两者都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。例如,在一个电商系统中,订单处理模块(高层模块)不应该直接依赖具体的数据库操作类(低层模块),而是应该依赖一个抽象的数据库操作接口。
  • 接口隔离原则(ISP):客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。例如,在一个系统中,如果一个客户端只需要使用某个接口的部分方法,那么应该将这个接口拆分成多个更小的接口,让客户端只依赖它需要的接口。
  • 迪米特法则(LoD):一个对象应该对其他对象有最少的了解。也就是说,一个类应该尽量减少与其他类的交互,只与直接的朋友进行通信。例如,在一个社交网络系统中,一个用户类应该只与直接相关的好友类、消息类等进行交互,而不应该与其他不相关的类进行过多的交互。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest测试专题 - 1.2 如何获得美观的测试报告

<< 返回目录 1 pytest测试专题 - 1.2 如何获得美观的测试报告 1.1 背景 虽然pytest命令的报文很详细&#xff0c;用例在执行调试时还算比较方便阅读和提取失败信息&#xff0c; 但对于大量测试用例运行时&#xff0c;可能会存在以下不足 报文被冲掉测试日志没法归档 …

让office集成deepseek,支持office和WPS办公软件!(体验感受)

导读 AIGC:AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术&#xff0c;能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…

QML布局和信号槽

目录 一、定位器&#xff08;Positioners&#xff09; 1.Row&#xff08;行定位器&#xff09; 2.Column&#xff08;列定位器&#xff09; 3.Grid&#xff08;表格定位器&#xff09; 二、Layout布局 1.RowLayout&#xff08;行布局&#xff09; 2.ColumnLayout&#x…

C++ Primer 类型转换

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

.Net使用EF Core框架如何连接Oracle

目录 一、Nutget包添加 二、 配置文件 三、创建实体类 四、创建数据库上下文类 五、将数据库上下文服务注册到容器 六、测试数据库数据 &#xff08;1&#xff09;编写PeopleController &#xff08;2&#xff09;编写People页面 一、Nutget包添加 一定要安装Oracle.Ma…

30~32.ppt

目录 30.导游小姚-介绍首都北京❗ 题目​ 解析 31.小张-旅游产品推广文章 题目 解析 32.小李-水的知识❗ 题目​ 解析 30.导游小姚-介绍首都北京❗ 题目 解析 新建幻灯片-从大纲-重置-检查设计→主题对话框→浏览主题&#xff1a;考生文件夹&#xff08;注意&#x…

2025 年 2 月 TIOBE 指数

2025 年 2 月 TIOBE 指数 二月头条:快,更快,最快! 现在,世界需要每秒处理越来越多的数字,而硬件的发展速度却不够快,程序的速度变得越来越重要。话虽如此,快速编程语言在 TIOBE 指数中取得进展也就不足为奇了。编程语言 C++ 最近攀升至第 2 位,Go 已稳居前 10 名,Ru…

【Flink源码分析】5. Flink1.19源码分析-异步编程(CompletableFuture)

5 CompletableFuture 实现异步编排&#xff1b;获取异步任务执行的结果。 CompletableFuture提供了几十种方法&#xff0c;辅助我们的异步任务场景。这些方法包括创建异步任务、异步任务回调、多个任务组合处理等方面。 5.1 supplyAsync 方法 supplyAsync 执行 Completable…

LabVIEW在呼吸机测试气体容量计算

在呼吸机测试中&#xff0c;精确测量气体容量变化是评估设备性能的关键步骤。通过监测呼吸机气道内的压力变化&#xff0c;并结合流阻和肺顺应性等参数&#xff0c;可以计算出单位时间内的气体容量变化。本案例基于LabVIEW实现该计算过程&#xff0c;以确保测试数据的准确性和一…

Lombok使用指南

引言 lombok作为减少我们代码量的利器&#xff0c;本文将列举常用的几个注解&#xff0c;来帮助减少代码量 注解及其功能 Getter 和 Setter import lombok.Getter; import lombok.Setter;Getter Setter public class Person {private String name;private int age; } …

JAVA学习第一天

String的构造方法-118 String创建对象的特点——119 String字符串的比较——120 字符串的遍历——122 两个函数&#xff1a;length&#xff08;&#xff09;&#xff0c;charAt&#xff08;&#xff09; StringBuilder——127 String的内容是不可变的 StringBuilder的内容是可变…

sqli-lab靶场学习(六)——Less18-22(User-Agent、Referer、Cookie注入)

前言 前面的关卡&#xff0c;都是直接在输入框或者浏览器的地址栏上做文章即可。但本文这几关&#xff0c;需要用工具拦截请求修改请求头部才行。 Less18&#xff08;User-Agent注入&#xff09; 本关的注入点在User-Agent。我们在用户名和密码框中输入admin/admin后&#xf…

Spring依赖注入方式

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

arcgis界址点编号工具开发原理(西北角顺时针)

arcgis界址点编号工具开发原理&#xff08;西北角顺时针&#xff09; 1、工具实现思路。寻找离包络矩形左顶角最近的点作为起点。如下图&#xff1a;距离包络矩形左顶角最近的点&#xff0c;作为J1点没有任何问题。 问题在于并不是所有的地块&#xff0c;都这么中规中矩、合情…

分布式服务框架 如何设计一个更合理的协议

1、概述 前面我们聊了如何设计一款分布式服务框架的问题&#xff0c;并且编码实现了一个简单的分布式服务框架 cheese, 目前 cheese 基本具备分布式服务框架的基本功能。后面我们又引入了缓存机制&#xff0c;以及使用Socket替代了最开始的 RestTemplate。并且还学习了网络相关…

生信云服务器:让生物信息学分析更高效、更简单【附带西柚云优惠码】

随着生物信息学的快速发展&#xff0c;基因组测序、单细胞分析等复杂任务逐渐成为研究者们的日常工作。然而&#xff0c;个人电脑在处理这些任务时往往面临性能瓶颈&#xff0c;如内存不足、运算速度慢等问题&#xff0c;导致分析任务频繁失败或崩溃。为了解决这一难题&#xf…

[AUTOSAR通信] - PDUR模块解读

点击订阅专栏不迷路 文章目录 一、 PDUR模块概述二、功能描述2.1 发送路由功能2.2 接收路由功能2.3 网关路由功能2.4 路由控制功能 三、配置項介紹3.1. PduRBswModules3.2. PduRGeneral3.3. PduRRoutingTables3.4. PduRRoutingPath3.5. PduRSrcPdu3.6. PduRDestPdu 四、总结 &g…

分治下的快速排序(典型算法思想)—— OJ例题算法解析思路

目录 一、75. 颜色分类 - 力扣(LeetCode) 运行代码: 一、算法核心思想 二、指针语义与分区逻辑 三、操作流程详解 四、数学正确性证明 五、实例推演(数组[2,0,2,1,1,0]) 六、工程实践优势 七、对比传统实现 八、潜在问题与解决方案 九、性能测试数据 十、扩展…

分层耦合 - IOC详解

推荐使用下面三种, 第一种多用于其他类 声明bean的时候&#xff0c;可以通过value属性指定bean的名字&#xff0c;如果没有指定&#xff0c;默认为类名首字母小写。 使用以上四个注解都可以声明bean&#xff0c;但是在springboot集成web开发中&#xff0c;声明控制器bean只能用…

PDF Shaper:免费多功能 PDF 工具箱,一站式满足您的 PDF 需求!

​PDF Shaper 是一款功能强大且完全免费的 PDF 工具箱&#xff0c;它几乎涵盖了日常 PDF 操作的方方面面&#xff0c;无论是转换、编辑还是处理&#xff0c;都能轻松搞定。以下是这款软件的详细介绍&#xff1a; 功能丰富&#xff0c;一应俱全 PDF 转换功能强大 PDF 转 Word&am…