开发中用到的设计模式

目录

开发中用到的设计模式

工厂模式

设计理念

好处

体现的编程思想

适配器模式

概念

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

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

设计模式的开发原则


开发中用到的设计模式

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

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

工厂模式

设计理念

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

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

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

适配器模式

概念

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

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

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

设计模式的开发原则

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

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

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

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

相关文章

1064 - You have an error in your SQL syntax;

在创建数据库表建立外键是遇到了如下报错 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near position(position_id) ) at line 8 数据库表sql如下: --职位表 CR…

无人机 ,遥控器与接收机之前的通信

目录 1、信号类型 2、工作频率 3、通信协议 3.1、PPM 协议 3.2、SBUS 协议 3.3、CRSF 协议 无人机的遥控器和接收机之间常用的信号、频率、协议等相关信息如下: 1、信号类型 模拟信号 特点:信号的幅度、频率或相位等参数是连续变化的&#xff0c…

【c++】四种类型转换形式

【c】四种类型转换形式 编译时: static_cast(静态转换) const_cast(去常性转换) reinterpret_cast(重新解释转换,直接转换地址) 运行时: dynamic_cast(动态转换,运行时类…

Cisco ASR1002查看资源占用的几条命令

查看平台资源 show platform resource 该命令用于显示整个平台的资源使用情况,包括 CPU、内存等 example: ASR1002# show platform resources **State Acronym: H - Healthy, W - Warning, C - Critical Resource…

Day 1:认知革命与DeepSeek生态定位

目标:建立对大模型技术范式的系统性认知,掌握DeepSeek的核心技术特性与生态价值 一、大模型技术演进:从GPT到DeepSeek 1.1 技术发展里程碑 2017-Transformer突破:Self-Attention机制如何突破RNN的序列建模瓶颈 2018-GPT初代&…

Python自动化办公之Excel拆分

在日常办公中,我们经常需要将包含多个Sheet页的Excel文件拆分成多个独立的Excel文件。例如,在发送Excel表给各部门确认时,出于控制知悉范围最小等保密性考虑,每个部门只需要查看和确认自己部门对应的Sheet页。手动拆分Excel文件非…

【CXX-Qt】1.1 Rust中的QObjects

本文涉及到了使用CXX-Qt将Rust、C和QML集成到Qt应用程序中的各个方面。下面,我将提供一个简单的示例,演示如何使用CXX-Qt来创建一个Rust结构体并将其作为QObject子类暴露给C和QML。 一、设置CXX-Qt环境 首先,确保您已经安装了Rust、CXX和CX…

Conda命令整理

Conda 是一个功能强大的包和环境管理工具,广泛用于 Python 开发中。除了基本的包和环境管理功能外,Conda 还提供了许多高级用法和技巧,帮助用户更高效地管理和维护 Python 环境。 1. 管理 Conda 本身 命令描述示例conda --version查看 Cond…

C++模拟实现AVL树

目录 1.文章概括 2.AVL树概念 3.AVL树的性质 4.AVL树的插入 5.旋转控制 1.左单旋 2. 右单旋 3.左右双旋 4.右左双旋 6.全部代码 1.文章概括 本文适合理解平衡二叉树的读者阅读,因为AVL树是平衡二叉树的一种优化,其大部分实现逻辑与平衡二叉树是…

opc da 服务器数据 转 EtherCAT项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 应用条件 4 查看OPC DA服务器的相关参数 5 配置网关采集opc da数据 6 启动EtherCAT从站转发采集的数据 7 在服务器上运行仰科OPC DA采集软件 8 案例总结 1 案例说明 在OPC DA服务器上运行OPC DA client软件查看OPC DA服务器的相…

实验9 基于WebGoat平台的SQL注入攻击

实验9 基于WebGoat平台的SQL注入攻击 1.实验目的 熟悉WebGoat平台,在该平台上实现SQL注入攻击。 2.实验内容 (1)下载webgoat-server-8.2.2.jar。 (2)搭建java环境。 (3)运行webgoat。 &#xf…

StochSync:可在任意空间中生成360°全景图和3D网格纹理

StochSync方法可以用于在任意空间中生成图像,尤其是360全景图和3D网格纹理。该方法利用了预训练的图像扩散模型,以实现零-shot生成,消除了对新数据收集和单独训练生成模型的需求。StochSync 结合了 Diffusion Synchronization(DS&…

研发管理知识

定义 研发管理是对研发活动进行有效的计划、组织、领导和控制的过程,旨在通过合理配置资源、协调团队工作、监控项目进度和质量等,确保研发项目能够按时、按质、按量完成,实现企业的技术创新和产品升级目标,增强企业的核心竞争力。…

HarmonyOS 5.0应用开发——全局自定义弹出框openCustomDialog

【高心星出品】 文章目录 全局自定义弹出框openCustomDialog案例开发步骤完整代码 全局自定义弹出框openCustomDialog CustomDialog是自定义弹出框,可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹出框…

AOS安装及操作演示

文章目录 一、安装node1.1 在 macOS 上管理 Node版本1.1.1 安装 nvm1.1.2 验证 nvm 是否安装成功1.1.3 使用 nvm 安装/切换 Node.js 版本1.1.4 卸载 Node.js 版本 1.2 在 windows 上管理 Node版本1.2.1 安装 nvm-windows1.2.2 安装 Node.js 版本1.2.3 切换 Node.js 版本1.2.4 卸…

DeepSeek模型R1服务器繁忙,怎么解决?

在当今科技飞速发展的时代,人工智能领域不断涌现出令人瞩目的创新成果,其中DeepSeek模型无疑成为了众多关注焦点。它凭借着先进的技术和卓越的性能,在行业内掀起了一股热潮,吸引了无数目光。然而,如同许多前沿技术在发…

AIGC-微头条爆款文案创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

[LLM面试题] 指示微调(Prompt-tuning)与 Prefix-tuning区别

一、提示调整(Prompt Tuning) Prompt Tuning是一种通过改变输入提示语(input prompt)以获得更优模型效果的技术。举个例子,如果我们想将一条英语句子翻译成德语,可以采用多种不同的方式向模型提问,如下图所示&#xf…

CSS 性能优化全攻略:提升网站加载速度与流畅度

系列文章目录 01-从零开始学CSS选择器:属性选择器与伪类选择器完全指南 02-避免样式冲突:掌握CSS选择器优先级与层叠规则的终极指南 03-如何精确掌控网页布局?深入解析 CSS 样式与盒模型 04-CSS 布局全面解析:从传统浮动到现代 F…

自主项目面试点总结

1、许苑–OJ判题系统 技术栈:Spring BootSpring Cloud AlibabaRedisMybatisMQDocker 项目地址: https://github.com/xuyuan-upward/xyoj-backend-microservice 1.1、项目介绍: 一个基于微服务的OJ系统,具备能够根据管理员预设的题目用例对用户提交的代…