23 种设计模式详解(全23种)

设计模式是一种解决特定问题的通用解决方案,主要用于软件开发中。常见的设计模式分为三大类:创建型模式、结构型模式和行为型模式。每类设计模式解决不同类型的问题。以下是每种类别中的常见设计模式:

创建型模式(5种)

1. 单例模式(Singleton Pattern)

  • 确保一个类只有一个实例,并提供全局访问点。
  • 例子:数据库连接池。

2. 工厂方法模式(Factory Method Pattern)

  • 定义一个创建对象的接口,让子类决定实例化哪一个类。
  • 例子:图形界面框架中的控件创建。

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

  • 提供一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。
  • 例子:跨平台UI库。

4. 建造者模式(Builder Pattern)

  • 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 例子:复杂对象的构建,如汽车或计算机。

5. 原型模式(Prototype Pattern)

  • 使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
  • 例子:对象的快速复制。

结构型模式(7种)

1. 适配器模式(Adapter Pattern)

  • 将一个类的接口转换成客户希望的另一个接口,使得原本因接口不兼容而不能一起工作的类可以协同工作。
  • 例子:电源适配器。

2. 装饰者模式(Decorator Pattern)

  • 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
  • 例子:Java中的I/O类。

3. 代理模式(Proxy Pattern)

  • 为其他对象提供一个代理,以控制对这个对象的访问。
  • 例子:远程代理、虚拟代理。

4. 外观模式(Facade Pattern)

  • 为子系统中的一组接口提供一个一致的界面,使得子系统更容易使用。
  • 例子:简化复杂API的接口。

5. 桥接模式(Bridge Pattern)

  • 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  • 例子:图形界面与平台无关的实现。

6. 组合模式(Composite Pattern)

  • 将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
  • 例子:文件系统中的文件和文件夹。

7. 享元模式(Flyweight Pattern)

  • 运用共享技术有效地支持大量细粒度的对象。
  • 例子:字符对象的缓存池。

行为型模式(11种)

1. 策略模式(Strategy Pattern)

  • 定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。
  • 例子:排序算法的选择。

2. 观察者模式(Observer Pattern)

  • 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 例子:事件监听机制。

3. 模板方法模式(Template Method Pattern)

  • 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。
  • 例子:游戏中的AI行为。

4. 命令模式(Command Pattern)

  • 将一个请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化。
  • 例子:菜单操作的撤销和重做功能。

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

  • 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  • 例子:事务处理中的日志记录。

6. 状态模式(State Pattern)

  • 允许对象在内部状态改变时改变它的行为。
  • 例子:状态机。

7. 备忘录模式(Memento Pattern)

  • 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象到原先保存的状态。
  • 例子:撤销操作。

8. 中介者模式(Mediator Pattern)

  • 用一个中介对象来封装一系列对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散。
  • 例子:聊天室。

9. 迭代器模式(Iterator Pattern)

  • 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。
  • 例子:遍历集合对象。

10. 访问者模式(Visitor Pattern)

  • 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
  • 例子:对象结构的操作。

11. 解释器模式(Interpreter Pattern)

  • 提供了解释语言的语法或表达式的方式。通过定义一个语言的文法表示,并且通过一个解释器来解释和执行这些文法表示的操作。

  • 例子:数学表达式计算器。

这些设计模式帮助开发人员创建灵活、可重用和可维护的代码。通过理解和应用这些模式,可以显著提升软件设计的质量和效率。

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

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

相关文章

0基础认识C语言(分支循环)

大家今天有没有开心的敲代码呢?hhhhhh让我们今天继续走进C语言~ 前提回顾: 上节课我们学习了一些单目操作符和双目操作符,还聊了一会儿 scanf 和 printf ,今天我们对前一次的内容做一次补充 1.如果你想输出一个保留五位小数并且…

OpenAI 近期动荡:解雇 Sam Altman 事件分析与 AI 未来展望

引言 OpenAI 的动荡从未停止。最近,由于 OpenAI 高层领导的更迭,引发了广泛的关注和讨论。特别是在 Sam Altman 被解雇后,再次回归 CEO 职位的过程,更是引起了公众和业内的巨大反响。前 OpenAI 董事会成员 Helen Toner 在最新一期…

探索未来科技的前沿:从量子计算到人机融合

探索未来科技的前沿:从量子计算到人机融合 科技的飞速发展正在不断改变我们的生活方式。从人工智能(AI)到物联网(IoT),再到区块链和量子计算,每一个新兴技术都在推动着我们的社会走向一个全新的未来。本文将深入探讨几项最新的前沿科技,了解它们如何改变我们的世界以及…

如何利用AI大模型给我写程序

文章目录 1,应用情景(给文件夹里的图片批量重命名)2,选择合适的AI大模型3,复制AI给出来的代码,在本地执行4,结果检查 1,应用情景(给文件夹里的图片批量重命名&#xff09…

JasperReport-动态数据源数据填充

一、数据填充 在正式环境中,报表中的内容或数据通常是通过查询底层数据源获取然后再进行数据填充。JasperReport的JAVA SDK中,提供了多种方法提供数据填充(如下其中一个示例): /** * 填充数据构造JasperPrint * is: 文件输入流 * parameters:参数 * connection:数据源…

代码随想录算法训练营第二十七天 | 39. 组合总和、40.组合总和II、131.分割回文串

39. 组合总和 题目链接:https://leetcode.cn/problems/combination-sum/ 文档讲解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html 视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ 思路 这道题和之前做…

如何通过拟合平面找到lidar点云数据intensity导数

source: chatgpt 我是知识的搬运工,尝试弄懂chat老师给我写的代码,我的思考历程是这样的 我跟它说生成一个关于intensity的导数,这是它生成的结果: def compute_gradient(neighbors_pts, neighbors_int):Fit a plane I(x, y, z)…

基于java的CRM客户关系管理系统(六)

目录 5.3 表现层设计 5.3.1 模型层(M) 5.3.2 视图层(V) 5.3.3 控制层(C) 5.4 系统主要功能模块的实现 5.4.1 登录功能的实现 5.4.2 客户管理的实现 5.5 本章小结 参考文献 前面内容请移步 基于java…

【CSS】scroll-snap属性详解

目录 scroll-snap-type方向:捕捉强度: scroll-snap-stopscroll-paddingscroll-margin实际使用示例 scroll-snap 是一个用于实现流畅滚动捕捉效果的 CSS 模块。它包含多个属性,可以应用于滚动容器和滚动子项上。 scroll-snap-type scroll-sna…

k8s学习--Secret详细解释与应用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Secret什么是Secret?Secret四种类型及其特点Secret应用案例(1)将明文密码进行base64编码(2)编写创建secret的YAML文…

笔试训练2

牛客.单词搜索 刚开始我就想是搜索,但是不清楚bfs还是dfs更好,我尝试了bfs但是队列存东西,没有我想象的那么好写,所以我决定试试dfs import java.util.*;public class Solution {static int m 0;static int n 0;static int […

【Qt快速入门(一)】- Qt简介

目录 Qt快速入门(一)Qt简介历史背景跨平台特性核心组件开发工具Qt Creatorqmake和CMake Qt的主要应用领域桌面应用移动应用嵌入式系统游戏开发Web应用 Qt社区和生态系统Qt MarketplaceQt认证 未来发展 Qt快速入门(一) Qt简介 Qt…

【人工智能Ⅱ】实验8:生成对抗网络

实验8:生成对抗网络 一:实验目的 1:理解生成对抗网络的基本原理。 2:学会构建改进的生成对抗网络,如DCGAN、WGAN、WGAN-GP等。 3:学习在更为真实的数据集上应用生成对抗网络的方法。 二:实验…

SaaS销售新指标|一文带你读懂什么是反向拒付指标

saas企业销售也需要一系列的指标来衡量企业运营情况如何?有哪些值得改善的地方?今天林叔发现一个比较有意思的新指标:反向拒付。希望能帮助saas企业更好的运营。 一、什么是反向拒付? **反向拒付指标(反拒付指标&…

C基础-标准库下

上:http://t.csdnimg.cn/qj5uA 目录 七. math.h 八. setjmp.h 九. signal.h 十. stdarg.h 十一.stddef.h 十二. stdio.h 十三. stdlib. 十四. string.h 十五. time.h 七. math.h 定义了各种数学函数和一个宏。 宏和函数描述 序号宏 & 描述1HUGE_VAL 当函数的结…

Vue3——实现word,pdf上传之后,预览功能(实测有效)

vue-office/pdf - npm支持多种文件(**docx、excel、pdf**)预览的vue组件库,支持vue2/3。也支持非Vue框架的预览。. Latest version: 2.0.2, last published: a month ago. Start using vue-office/pdf in your project by running npm i vue-office/pdf. There are …

怎么样的电销机器人才是好的?智能语音机器人部署

在现代社会,营销策略对于企业的成功至关重要。随着技术的发展,电销机器人正在改变传统营销模式,取而代之的是更高效,更自动化和更个性化的方式。 当然,如何选择合适的电销机器人是很重要的。所以,我们就来看…

Mybatis实现树形结构方式

1,三级分类树形结构查询 /*** DDD(Domain-Driven Design): 领域驱动设计** 三级分类树形结构;* 支持无限层级;* 当前项目只有三级*/ Data public class CategoryTreeTo {private Long categoryId; //1private String categoryName;private …

ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据(带有Metadata),附常见问题

ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据(带有Metadata) 文章目录 ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据(带有Metadata)前言数据下载ENVI 5.3打开Landsat 8 C2L2级别数据ENVI 5.3打开Landsat 9 C2L2级别数据ENVI 6.0打开La…

RDMA介绍

RDMA全称是Remote Direct Memory Access,即远程直接内存访问,是一种高性能网络通信技术,可以使计算机直接访问远端计算机的内存,而无需在本地和远程计算机之间进行数据复制。 相比于传统的网络通信方式,RDMA技术具有更…