23种设计模式学习导航

23种设计模式在Java中是一种重要的软件开发原则,旨在提高代码的可维护性、可扩展性和重用性。这些设计模式分为创建型模式、结构型模式和行为型模式三类。以下是这23种设计模式的Java完整版学习导航:

一、创建型模式(5种)

  1. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。

    • 饿汉式:在类加载时就创建实例。
    • 懒汉式:在第一次使用时才创建实例。
    • 双检锁/双重校验锁(DCL,即 double-checked locking):线程安全的懒汉式实现。
    • 静态内部类:利用JVM的类加载机制实现线程安全的延迟初始化。
    • 枚举:利用枚举的特性实现单例。
  2. 工厂模式(Factory Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类。

    • 简单工厂模式:一个工厂类根据传入的参数决定创建哪一种产品类的实例。
    • 工厂方法模式:定义一个创建对象的接口,让子类决定实例化哪一个类。
    • 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
  3. 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

  4. 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

  5. 对象池模式(Object Pool Pattern):复用对象以减少创建和销毁对象的开销。

二、结构型模式(7种)

  1. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。
  2. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
  3. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。
  4. 代理模式(Proxy Pattern):为其他对象提供一个代理以控制对这个对象的访问。
  5. 外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
  6. 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们都可以独立地变化。
  7. 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。

三、行为型模式(11种)

  1. 策略模式(Strategy Pattern):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。
  2. 模板方法模式(Template Method Pattern):定义一个操作中的算法的框架,而将一些步骤延迟到子类中。
  3. 观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
  4. 迭代子模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
  5. 责任链模式(Chain of Responsibility Pattern):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  6. 命令模式(Command Pattern):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
  7. 备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
  8. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
  9. 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
  10. 中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  11. 解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

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

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

相关文章

Maven多环境与SpringBoot多环境配置

1. Maven多环境配置与应用 1.1 多环境开发 我们平常都是在自己的开发环境进行开发, 当开发完成后,需要把开发的功能部署到测试环境供测试人员进行测试使用, 等测试人员测试通过后,我们会将项目部署到生成环境上线使用。 这个时…

Spring中用到的设计模式有哪些

工厂模式,BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象。 单例模式,Spring依赖注入Bean实例默认是单例的。Spring依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创…

手写8大排序算法Java版

如何手写8大排序算法:从入门到精通 排序算法是计算机科学中最基本的算法之一,几乎所有编程语言的面试都会涉及到排序算法的问题。掌握排序算法不仅能够帮助你更好地理解数据结构和算法,还能提升你解决实际问题的能力。本文将带你从零开始&am…

VSCode调试Typescript

目录 背景介绍安装运行问题提示没有npm或者tsc命令提示tsc : 无法加载文件ts-debugObject.defineProperty(exports, __esModule, { value: true })调试时自动断点 背景介绍 由于近期要涉及鸿蒙相关的功能,之前没有接触过TS这个语言,所以想要熟悉一下。 …

Unity曲线插件Dreamteck Splines生成曲线Mesh

一、需求 脱离编辑器,运行时添加点,动态生成管道、线缆等曲线Mesh。 二、Dreamteck Splines简单运用 这方面资料不多,只有官方文档全英参考,而且又介绍得不详细。 2个重要组件介绍: SplineComputer: 最…

yum、rpm相关命令-工具手册

1.rpm文件: 1.1安装rpm文件: rpm -ivh kde-select.rpm23 #--nodeps强制安装,无视环境缺少依赖的检查 rpm -ivh --nodeps kde-select.rpm #--force --replacefiles可以无视rpm的冲突去强制替换(如两个rpm的安装路径相同了会有冲突) rpm -ivh --nodeps --force --replacef…

设计模式——备忘录模式(Memento)

备忘录模式(Memento Pattern),也称为快照模式或Token模式,是GoF(Gang of Four,四位设计模式专家)提出的23种设计模式之一,属于行为模式。该模式的主要目的是在不破坏封装性的前提下&…

springboot中mybatisplus注意事项

使用代码生成工具CodeGenerator 需要修改的内容 dsc.setUsername(“root”); mysql账号dsc.setPassword(“root”); mysql密码strategy.setInclude(“crm_edu”); 表名pc.setModuleName(“eduservice”); //模块名 package com.test.demo;import com.baomidou.mybatisplus.a…

【超详细】跑通YOLOv8之深度学习环境配置2

环境配置2下载安装内容如下: CUDA:https://developer.nvidia.com/cuda-toolkit-archive cudnn:https://developer.nvidia.com/rdp/cudnn-archive 版本:CUDA11.3 cudnn8.9.7 CUDA安装 简介 CUDA(Compute Unified De…

vue如何进行webpack的配置

Vue.js 项目通常使用 Vue CLI 来创建和管理,它内置了 Webpack 作为构建工具。然而,如果你想要手动配置 Webpack 或者有特定的需求,你也可以在 Vue 项目中直接进行 Webpack 的配置。 下面是一个简单的步骤,介绍如何在 Vue 项目中手…

使用Python创建一个简单的任务管理器应用程序

在这篇文章中,我们将探讨如何使用Python和Tkinter库来创建一个简单但功能强大的任务管理器应用程序。这个应用程序将允许用户添加、编辑、删除和完成任务,并提供一个直观的用户界面。 1. 设计用户界面 我们首先设计用户界面。我们将使用Tkinter库来创建…

SEO之为什么研究关键词(一)

初创企业需要建站的朋友看这篇文章,谢谢支持: 我给不会敲代码又想搭建网站的人建议 新手上云 初做网站的人很容易犯的最大错误之一是,脑袋一拍就贸然进入某个领域,跳过竞争研究,没规划好目标关键词就开始做网站。这样做…

一个递推通项公式研究

递推关系为a(n) ​pa(n−1) ​ qa(n−2) ​,本项前一项*2前前项,具体如 1,1,3,7,17,41,99,239,…… 一般的递推关系可以用以下方法 得两个解: …

python算法demo0512

最长回文数 代码 class Solution:def longestPalindrome(self, s: str) -> str:n len(s)if n < 2:return smax_len 1begin 0# dp[i][j] 表示 s[i..j] 是否是回文串dp [[False] * n for _ in range(n)]for i in range(n):dp[i][i] True# 递推开始# 先枚举子串长度fo…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…

cae仿真软件是啥

CAE&#xff08;Computer Aided Engineering&#xff09;仿真软件是一种专门用于工程设计和分析的软件&#xff0c;它集成了计算机科学、物理学、数学等多个领域的知识&#xff0c;能够对复杂的工程系统进行建模、仿真和分析。CAE软件通过数值计算和模拟技术&#xff0c;可以模…

十三、Redis哨兵模式--Sentinel

上一篇介绍了Redis中的主从复制。我们知道Redis主从中一般只有主节点对外提供写操作&#xff0c;如果主节点发生故障&#xff0c;为了保证Redis的可用性&#xff0c;这时就要在可用的slave节点中&#xff0c;挑选一个作为主节点。这种切换操作如果是人为的操作&#xff0c;那么…

支持播放h265的插件

插件源码地址&#xff1a;GitCode - 开发者的代码家园https://gitcode.com/mirrors/nanguantong/flv-h265.js/overview 1. 下载代码 运行以下命令 npm i npm run build npm run build 后生成 flv.min.js 文件&#xff0c;引入使用 2. 调用 js 文件&#xff1a; let flvj…

关于-RTSP推流方案, ffmpeg 视频转 m3u8

参考文章 https://zhuanlan.zhihu.com/p/668110375 增加fmpeg 执行单个视频推流 ffmpeg -re -stream_loop -1 -i 你视频的文件名 -c copy -f rtsp rtsp://127.0.0.1:8554/videohttps://blog.csdn.net/EthanCo/article/details/125321957 Windows下安装使用ffmpeg https://z…

uniapp开发小程序使用vue的v-html解析富文本图片过大过宽显示超过屏幕解决办法

如果没有设置的话&#xff0c;就会导致图片溢出&#xff0c;过宽显示或者错位显示&#xff0c;显示效果非常的丑陋&#xff1a; 修改后显示的效果&#xff1a; 网上比较low的解决办法&#xff1a;网上各种解决方法核心思想就是在数据层把数据模板上的img数据加上style样式&…