永不磨灭的设计模式(23种设计模式全集)

news2024/12/21 16:34:48

永不磨灭的设计模式

  • 概述
  • 七大基本原则
  • 23种设计模式
      • 1、单例模式
      • 2、工厂(方法)模式
      • 3、抽象工厂模式
      • 4、原型模式
      • 5、建造者模式
      • 6、适配器模式
      • 7、桥接模式
      • 8、组合模式
      • 9、装饰器模式
      • 10、外观模式
      • 11、享元模式
      • 12、代理模式
      • 13、责任链模式
      • 14、命令模式
      • 15、迭代器模式
      • 16、中介者模式
      • 17、备忘录模式
      • 18、观察者模式
      • 19、状态模式
      • 20、策略模式
      • 21、模板方法模式
      • 22、访问者模式
      • 23、解释器模式
  • 总结
  • 源码

概述

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。

七大基本原则

  • 单一职责原则
  • 里氏替换原则
  • 依赖倒置原则
  • 开闭原则
  • 接口隔离原则
  • 迪米特法则
  • 合成复用原则

详细讲解:七大原则

23种设计模式

我们将23种设计模式分为创建型模式、结构型模式和行为模式。

  • 创建型模式:提供创建对象的机制,能够提升已有代码的灵活性和可复用性
  • 结构型模式:介绍如何将对象和类组成比较大的结构,并同时保持结构的灵活和高效
  • 行为模式:负责对象间的搞笑沟通和职责委培
    在这里插入图片描述

创建型模式

1、单例模式

单例模式就是对象永远只会生成同一个对象,不论如何创建都返回同一个对象。是最简单的设计模式。

详细讲解:设计模式 - 单例模式

2、工厂(方法)模式

简单工厂模式:

我们需要了解简单工厂模式。简单工厂模式就好比我们在家吃饭,只需要告诉妈妈想吃什么即可,不需要去向具体的制作过程。

放到我们的代码中就是有一个工厂类,它可以创建一对象,我们只需要告诉它我们想要什么对象即可。

工厂(方法)模式就好比我们去外面吃饭,不同的店提供不同的食品,我们挑选自己想吃的食品进去下单即可。

为什么要使用工厂(方法)模式:

因为如果我们要扩展可以创建不同的对象,那简单工厂就是需要去修改工厂类的源码的,这违反了开闭原则。

所以就将工厂设置为了抽象类,不同的工厂继承抽象工厂类即可生成不同的产品,想要什么样的产品就使用什么工厂类即可。

这样在扩展的时候只需要创建不同的工厂类即可。

详细讲解:设计模式 - 工厂(方法)模式

3、抽象工厂模式

抽象工厂模式可以简单理解为一个大的食堂,这个食堂有各种各样的食品,我们需要要下单即可送到我们身边。

与工厂(方法)模式的区别:

工厂(方法)模式中的工厂还是只能生成同一类的产品,而抽象工厂模式则可以实现不同种类的产品。如果抽象工厂模式也只生成一种品类的产品,那将退化为抽象(工厂)方法

详细讲解:设计模式 - 抽象工厂模式

4、原型模式

原型模式理解为克隆,即创建重复的对象,但又可以保证性能。

实现Cloneable接口并重写clone()方法即可实现克隆

关于浅克隆和深克隆

详细讲解:设计模式 - 原型模式

5、建造者模式

对于复杂对象,我们是不可能一下将这个对象创建出来的,我们需要将这个对象进行拆解,然后按步骤来创建这个复杂的对象,实现了创建复杂对象的灵活性和可读性。

例如生产汽车,不可能是一下就将汽车创建出来new Car("发动机","轮胎","..."),而是将不同的零件按步骤添加到车辆中car.set("发动机") ......

详细讲解:设计模式 - 建造者模式

结构型模式

6、适配器模式

适配器模式可以简单理解为手机充电器,手机充电是不能直接使用220V交流电的,所以需要使用充电器来将电压转为5V才能充电。

根据单一职责原则,一个类只负责一种功能,所以交流电和手机使用的电压对应两个不同的类,这样就可以增加一个适配器类来将两个类进行适配,这就是适配器模式。

详细讲解:设计模式 - 适配器模式

7、桥接模式

桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

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

详细讲解:设计模式 - 桥接模式

8、组合模式

组合模式可以理解为一个树形结构中的各个元素都是结构相同的对象,我们来将这些元素抽象为一个抽象类,自己组和自己。

这样就不需要每一个层次都创建自己的结构,使用同一个结构即可。

详细解析:设计模式 - 组合模式

9、装饰器模式

装饰器模式就是允许一个现有的对象添加功能,同时又不改变其结构。

我们可以想想去咖啡店点咖啡的时候,点了咖啡还可以加许多配料,设计这样的结构并且使代码符合开闭原则。

详细讲解:设计模式 - 装饰器模式

10、外观模式

外观模式隐藏了系统的复杂性,并向客户端提供一个可以访问的接口。

例如我们在家里看电影,我们要做很多准备,但是如果我们有智能家庭影院的话我们只需要点几个按钮就可以了。智能家庭影院屏蔽了一些繁琐的细节,提供给我们简单明了的步骤。

详细讲解:设计模式 - 外观模式

11、享元模式

享元模式即共享元素,如果一个需求基本都是相同的,那就将这个系统可变的需求独立出来,后面使用时只需要改变不同的位置即可,共同的地方是公用的。

享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。

详细讲解:设计模式 - 享元模式

12、代理模式

代理模式主要有三种实现:静态代理、动态代理合Cglib代理。

详细讲解:设计模式 - 代理模式

行为模式

13、责任链模式

为请求创建一个链式结构,链中的每一个节点依次对请求进行处理。知道满足结束条件即可。

详细讲解:设计模式-责任链模式

14、命令模式

命令模式就是将我们需要执行的动作制作为命令,发送者只需要发送命令,具体命令怎么执行和谁来执行都不需要关注。

例如古代将军发号施令,它是不需要关注具体的执行过程的。

详细讲解:设计模式 - 命令模式

15、迭代器模式

迭代器模式就是将容器遍历的行为和容器分离开来,例如树的结构有好几种遍历方式,我们容器只关注树的存储结构,迭代器只关注容器的遍历方法,这样组和起来即可满足开闭原则。

详细讲解:设计模式 - 迭代器模式

16、中介者模式

中介者模式是用来降低多个对象和类之间的通信复杂性。将复杂的逻辑都维护到一个中介类中,其他类之间可以实现松耦合,使代码易于维护。

详细讲解:设计模式 - 中介者模式

17、备忘录模式

备忘录模式就是保存某一时刻某个对象的重要属性,以便在适当的时候恢复。

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

详细讲解:设计模式 - 备忘录模式

18、观察者模式

观察者模式就是被观察者实现一个存放观察者的集合,当发送变化时及时将信息同步到观察者。

详细讲解:设计模式 - 观察者模式

19、状态模式

学漏一个,后续补充

20、策略模式

一个类的行为或其算法可以在运行时更改,类中组和一个策略接口,随策略的改变,类产生的结果不同。

详细讲解:设计模式 - 策略模式

21、模板方法模式

在模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

详细讲解:设计模式 - 模板方法模式

22、访问者模式

访问者模式就是将数据结构和数据操作分离,可以动态的变化数据操作。这个模式解决了稳定的数据结构和易变的操作耦合问题。

详细讲解:设计模式 - 访问者模式

23、解释器模式

解释器模式就是给我们一个特定的规则,我们来创建解释器,后续依据这解释器就可以得到结果。

解释器模式就是一个框架,按这个框架我们就能开发自己的解释器。

详细讲解:设计模式 - 解释器模式

总结

本篇为设计模式的汇总,详细的讲解可以点击对应的连接来学习。

后续我将会继续完善这些文章,将自己在工作中的体会输出到专栏中

你可以先点赞收藏起来,这样就不怕找不到这篇文章啦。

源码

GitHub源码地址:design-patterns

目前仓库中拥有23种设计模式的代码示例,后续将会增加更多实际问题中关于设计模式的代码Demo

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

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

相关文章

tinkerCAD案例:3.基本按钮

基本按钮 在本课中,您将学习制作具有圆柱形状的基本按钮。 说明 将圆柱体拖动到工作平面。 将其缩小到 2 毫米的高度。 提示: 您可以使用圆柱形状顶部的白点缩小圆柱体。 将其缩小到直径 16 毫米。 这将是按钮的主要形状。 现在我们可以创建允许将纽…

CSS动画:多动画同步播放或非同步播放

前言 本篇在讲什么 在CSS样式表现动画的基础上的拓展 本篇适合什么 适合初学H5的小白 适合初学CSS的小白 适合入门的前端程序 本篇需要什么 对Html和css语法有简单认知 Node.js(博主v18.13.0)的开发环境 Npm(博主v8.19.3)的开发环境 依赖VS code编辑器 本篇的特色…

impala内存超限

目录 一、背景 二、报错内容 三、解决办法 1.调参 2.简单粗暴 一、背景 impala shell执行SQL语句时报错 二、报错内容 Memory limit exceeded: Could not allocate memory while trying to increase reservation. 三、解决办法 1.调参 mem_limit参数:&…

ciscn 2023 初赛 pwn shell we go

ciscn 2023 初赛 pwn shell we go 这题go pwn,符号恢复就恢复很长时间了,网上的插件好多都没用 根着流程,可以看到这里有一个验证,以空格来分割,第一个参数会验证是否为nAcDsMicN 如果第一个参数验证通过&#xff0c…

Centos7 开启图形化界面 Linux安装VNC

环境: Centos7 windows连接:下载VNC Viewer 目录 VNC概述 VNC原理 一、检查是否安装过VNC 二、安装图形化界面 三、安装和配置VNC服务 四: 启动VNC及常用命令 五: VNC windos连接工具连接 VNC概述 VNC (Virtual Network Computing)是虚拟网络计算机的缩写…

如何零基础自学网络安全?

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解…

性能优化记录

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ 前言 最近零零散散的对刚接手的一个新项目做了一些优化,白屏、打包相关的内容都涉及到了,写一篇文章来记录一下。 白屏相关 DNS…

chatgpt赋能python:Python同一行语句之间的分隔

Python同一行语句之间的分隔 在Python中,同一行内的语句通常使用分号 ‘;’ 分隔开来。分号作为语句之间的分隔符,可以使我们在同一行内写多条语句,从而减少代码行数,提高代码可读性和可维护性。 分隔符和代码风格 在使用分号进…

[C++]基本知识与概念

C基础知识与概念 C与C基础C面向对象C STLC 内存管理C11新特性C linux编程I/O多路复用 前言 本文章适用于有一定C基础的新手同学快速掌握一些C的基本知识概念以及面试中可能会问的内容,如果你没有相应的基础学习又因为这篇文章缺少代码讲解所以可能会影响你的学习效率…

Mysql安装教程(windows)

本文主要讲解如何去安装使用Mysql 一、下载Mysql 1、官网在线下载 MySQL官网:https://www.mysql.com/downloads/ 下载版本:MySQL Installer for Window 2、云盘离线下载 https://pan.baidu.com/s/1dB7kFiwrKpF5W-5XPn2FeQ?pwdrvb9 提取码:…

【图像任务】Transformer系列.2

两篇改进Transformer结构的论文:MAN(arXiv2022),ScalableViT(ECCV2022). Multi-Scale Attention Network for Single Image Super-Resolution, arXiv2022 解读:【ARIXV2209】Multi-Scale Atten…

Java课程设计-学生管理系统《控制台版本》

博主介绍:✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

JavaEE(系列20) -- 网络编程之UDP和TCP套接字

目录 1. 网络编程 2. UDP网络编程 2.1 DatagramSocket API 2.2 DatagramPacket API 2.3 基于UDP实现的回显服务器 2.3.1 UDP服务器设计步骤 2.3.2 服务器代码 2.3.3 客户端代码 2.3.4 基于UDP写一个字典服务器 3. TCP网络编程 3.1 ServerSocketAPI 3.2 SocketAPI …

如何不出国一年内拿到加拿大女王大学金融硕士学位证书?

作为加拿大最好的公立大学之一,QueensUniversity位于安大略省的金斯顿市。最近,它在QS全球大学排名中跻身第209位,同时在加拿大的综合排名中名列第7位。这表明女王大学在学术研究和教育方面都有着出色的表现。Queens University坐落于安大略省…

分布式光伏发电远程监控系统

分布式光伏发电远程监控系统 项目背景 新能源、可再生能源接入电网是智能电网建设的重要组成,也是能源互联网发展的基础。近年来,太阳能光伏发电技术快速发展,光伏发电并网对配电网的影响也不断加深。电网调度人员需要人工参与光伏发电站的发…

RK3588+FPGA+Cameralink高速相机解决方案

1. 视频接入,其中可见使用LVDS,红外使用cameralink 2. H264低倍率压缩编码本地存储 3. H264压缩使用同步422接口或者网口UDP协议输出实时码流 4. 使用串口进行通讯,进行类似于可见、红外或者激光器或者地面控制软件等之间的通讯 5. 使用网…

SpringBoot3-基础配置和多环境开发

1. 配置文件格式 提供三种属性配置方式,当三个配置文件都有,加载顺序从前至后 示例第二种(主要也是用这个): 2. yaml格式 3. yaml读取数据格式的三种方式 第一种,使用Value读取单一属性数据 Value("${…

基于redis实现消息队列(更推荐使用专业的mq)

目录 利用redis实现消息队列(基于list,点对点模型)——lpush存放队列(lpush 队列名 队列内容(可一次存放多个内容,用空格隔开)) brpop取队列(brpop 队列名 等待时间单位秒…

机器视觉日常习题(更新中。。。)

目录 第二讲 图像处理概述 第二讲 图像处理概述 几何变换:又称为图像空间变换,它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置。图像分割:把图像分成各具特色的区域并提取感兴趣目标的技术和过程。图像边缘: 平滑&#…

【深入浅出 Spring Security(六)】一文搞懂密码的加密和比对

Spring Security 中的密码加密 一、PasswordEncoder 详解常见的实现类(了解)DelegatingPasswordEncoder源码分析DelegatingPasswordEncoder 在哪实例化的? 二、自定义加密自定义方式一:使用{id}的形式自定义方式二:向S…