深入理解Java设计模式:23种模式的全面解析

news2024/9/22 21:31:47

深入理解Java设计模式:23种模式的全面解析

    • 一、创建型模式
      • 1. 单例(Singleton)模式
      • 2. 原型(Prototype)模式
      • 3. 工厂方法(Factory Method)模式
      • 4. 抽象工厂(Abstract Factory)模式
      • 5. 建造者(Builder)模式
    • 二、结构型模式
      • 6. 代理(Proxy)模式
      • 7. 适配器(Adapter)模式
      • 8. 桥接(Bridge)模式
      • 9. 装饰(Decorator)模式
      • 10. 外观(Facade)模式
      • 11. 享元(Flyweight)模式
      • 12. 组合(Composite)模式
    • 三、行为型模式
      • 13. 模板方法(Template Method)模式
      • 14. 策略(Strategy)模式
      • 15. 命令(Command)模式
      • 16. 职责链(Chain of Responsibility)模式
      • 17. 状态(State)模式
      • 18. 观察者(Observer)模式
      • 19. 中介者(Mediator)模式
      • 20. 迭代器(Iterator)模式
      • 21. 访问者(Visitor)模式
      • 22. 备忘录(Memento)模式
      • 23. 解释器(Interpreter)模式


💖The Begin💖点点关注,收藏不迷路💖

在Java编程中,设计模式是解决常见问题的最佳实践总结,以下是对23种常见Java设计模式的详细解析。

一、创建型模式

1. 单例(Singleton)模式

  • 功能:确保一个类只有一个实例,并提供一个全局访问点。
  • 应用场景:配置文件的读取、数据库连接池等。

2. 原型(Prototype)模式

  • 功能:通过复制现有的实例来创建新的实例。
  • 应用场景:对象创建成本较高、需要频繁创建和销毁对象时。

3. 工厂方法(Factory Method)模式

  • 功能:定义一个用于创建对象的接口,让子类决定实例化哪个类。
  • 应用场景:创建对象的过程复杂、需要依赖具体实现时。

4. 抽象工厂(Abstract Factory)模式

  • 功能:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
  • 应用场景:系统需要独立于产品的创建、组合和表示时。

5. 建造者(Builder)模式

  • 功能:将一个复杂对象分解成多个简单部分,然后逐步构建。
  • 应用场景:构建复杂对象时,其构建过程需要精确控制。

二、结构型模式

6. 代理(Proxy)模式

  • 功能:为其他对象提供一种代理以控制访问。
  • 应用场景:远程代理、虚拟代理、安全代理等。

7. 适配器(Adapter)模式

  • 功能:将一个类的接口转换成另一个接口,使原本不兼容的类可以一起工作。
  • 应用场景:旧系统升级、使用第三方库等。

8. 桥接(Bridge)模式

  • 功能:将抽象与实现分离,使它们可以独立变化。
  • 应用场景:抽象和具体实现经常需要变化时。

9. 装饰(Decorator)模式

  • 功能:动态地给对象增加一些额外的职责。
  • 应用场景:需要扩展对象功能,但又不想使用继承时。

10. 外观(Facade)模式

  • 功能:为复杂子系统提供一个简单的接口。
  • 应用场景:简化复杂系统的访问,隐藏子系统细节。

11. 享元(Flyweight)模式

  • 功能:运用共享技术来有效支持大量细粒度对象的复用。
  • 应用场景:对象数量庞大且创建成本较高时。

12. 组合(Composite)模式

  • 功能:将对象组合成树形结构以表示部分-整体层次结构。
  • 应用场景:表示对象的部分-整体层次结构时。

三、行为型模式

13. 模板方法(Template Method)模式

  • 功能:定义一个算法骨架,将某些步骤延迟到子类中实现。
  • 应用场景:算法骨架不变,具体步骤可变时。

14. 策略(Strategy)模式

  • 功能:定义一系列算法,并将它们封装起来,使它们可以相互替换。
  • 应用场景:算法家族、多种算法可互换时。

15. 命令(Command)模式

  • 功能:将请求封装为对象,使请求发送者和接收者解耦。
  • 应用场景:请求发送者和接收者需要解耦时。

16. 职责链(Chain of Responsibility)模式

  • 功能:将请求沿链传递,直到找到处理者。
  • 应用场景:请求处理者不明确或动态变化时。

17. 状态(State)模式

  • 功能:允许对象在内部状态改变时改变其行为。
  • 应用场景:对象行为随状态改变而变化时。

18. 观察者(Observer)模式

  • 功能:当一个对象变化时,通知所有依赖它的对象。
  • 应用场景:对象间存在一对多依赖关系时。

19. 中介者(Mediator)模式

  • 功能:通过中介者对象来降低对象间的耦合度。
  • 应用场景:对象间存在复杂交互时。

20. 迭代器(Iterator)模式

  • 功能:提供一种方法来顺序访问聚合对象中的元素。

  • 应用场景:需要遍历聚合对象时。

21. 访问者(Visitor)模式

  • 功能:在不修改对象结构的前提下,给对象结构中的每一个元素增加新的操作。
  • 应用场景:需要对一个对象结构中的对象进行不同的、不相关的操作时,以及这些操作需要随着对象的结构变化而增加时。

22. 备忘录(Memento)模式

  • 功能:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将该对象恢复到原先保存的状态。
  • 应用场景:需要保存和恢复对象状态,且不希望暴露对象的实现细节时。

23. 解释器(Interpreter)模式

  • 功能:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
  • 应用场景:当需要定义一个简单的语言或语法规则,并且希望有一个解释该语言的解释器时。这通常用于构建领域特定语言(DSL)。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

JavaWeb中的Servlet

本笔记基于【尚硅谷全新JavaWeb教程,企业主流javaweb技术栈】https://www.bilibili.com/video/BV1UN411x7xe?vd_sourcea91dafe0f846ad7bd19625e392cf76d8总结 Servlet Servlet简介 动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运…

Chapter 30 多态

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、基本概念二、抽象类 前言 多态(Polymorphism)是面向对象编程中的核心概念,本章将详细讲解 Python 中多态的实现方式以及如何应用…

SQL Zoo 8.Using Null

以下数据均来自SQL Zoo 1.List the teachers who have NULL for their department.(列出所属部门为NULL的教师) select name from teacher where dept is null 2.Note the INNER JOIN misses the teachers with no department and the departments wit…

【Git】Git安装_配置

一、Git的安装 1. 下载Git 官方下载:访问Git的官方网站https://git-scm.com/,在首页找到下载链接。但需要注意的是,由于Git的服务器位于国外,直接下载可能会比较慢。镜像下载:推荐使用国内的镜像网站进行下载&#x…

【Canvas与艺术】蓝波纹白底黄星徽章

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>蓝波纹白底黄星徽章</title><style type"text/css&qu…

《系统架构设计师教程(第2版)》第13章-层次式架构设计理论与实践-04-数据访问层设计

文章目录 1. 五种数据访问模式1.1 在线访问1.2 DAO1.3 DTO1.4 离线数据模式1.5 对象/关系映射 (O/R Mapping) 2. 工厂方法模式在数据访问层应用3 ORM、Hibernate与CMP2.0设计思想3.1 ORM3.2 Hibernate1&#xff09;概述2&#xff09; Hibernate的架构&#xff08;2023年的考题&…

SpringBoot统一功能处理——统一数据返回格式

目录 一、简单使用 二、存在的问题描述 三、优点 一、简单使用 统一的数据返回格式使用 ControllerAdvice 和 ResponseBodyAdvice 的方式实现 ControllerAdvice 表示控制器通知类。 添加类 ResponseAdvice , 实现 ResponseBodyAdvice 接口&#xff0c;并在类上添加 …

【jQuery】入门学习篇

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、jQuery简介及使用详解&#xff1a;☀️☀️☀️2.1 jQuery简介2.2 引入jQuery① 第一种引入方式&#xff1a;直接路径引入② 第二种引入方式&#xff1a;使用第三方CDN 后序还在更新中~~~三、总结&#xff1a;&am…

C++_基本语法笔记_类和对象

对于有Java基础的思想不过多记录&#xff0c;仅看语法 创建和封装对象 类似Java中的set操作&#xff0c;可以写一个赋值操作用于给实例化对象赋属性值 三种权限&#xff1a;public &#xff0c; protect &#xff0c;private Class和Struct区别 Struct默认为public权限cla…

SpringBoot统一功能处理——拦截器

目录 一、什么是拦截器&#xff1f; 二、拦截器使用 2.1 定义拦截器 2.2 注册配置拦截器 三、拦截器详解 3.1 拦截器的拦截路径配置 3.2 拦截器执行流程 一、什么是拦截器&#xff1f; 拦截器是Spring框架提供的核心功能之一, 主要用来拦截用户的请求, 在指定方法前后,…

C语言 | Leetcode C语言题解之第332题重新安排行程

题目&#xff1a; 题解&#xff1a; char* id2str[26 * 26 * 26];int str2id(char* a) {int ret 0;for (int i 0; i < 3; i) {ret ret * 26 a[i] - A;}return ret; }int cmp(const void* _a, const void* _b) {int **a (int**)_a, **b (int**)_b;return (*b)[0] - (*…

python网络爬虫使用代理

Python网络爬虫使用代理的实用指南 在网络爬虫的开发过程中&#xff0c;使用代理是一个非常重要的环节。代理不仅可以帮助爬虫绕过反爬虫机制&#xff0c;还能保护开发者的隐私。本文将介绍如何在Python中使用代理进行网络爬虫&#xff0c;包括基本的设置和示例代码。 1. 代理…

手机短视频素材网站有哪些啊?手机视频素材库网站分享

在当今的数字时代&#xff0c;智能手机与社交媒体平台的融合推动了手机短视频的兴起。这种形式的媒体已经渗透到我们的日常生活中&#xff0c;无论是作为娱乐手段、教育工具还是商业推广手段&#xff0c;优质的短视频都具有极高的吸引力和广泛的应用价值。因此&#xff0c;选择…

『 C++ 』智能指针 ( 万字梳理 )

文章目录 智能指针概念内存泄漏的危害RAII与智能指针智能指针的赋值auto_ptr 管理权转移auto_ptr 的对象悬空问题 unique_ptr 防拷贝unique_ptr 简单实现 shared_ptr 引用计数shared_ptr 简单实现shared_ptr 的循环引用问题与 weak_ptr 智能指针的自定义删除器 智能指针概念 智…

【独家原创】基于NRBO-Transformer多特征分类预测【24年新算法】 (多输入单输出)Matlab代码

【独家原创】NRBO-Transformer分类 Matlab代码 基于牛顿拉夫逊优化算法优化Transformer的数据分类预测&#xff0c;Matlab代码&#xff0c;可直接运行&#xff0c;适合小白新手 NRBO优化的超参数为&#xff1a;自注意力机制中的头数、正则化系数、初始化学习率 1.程序已经调试…

《知识点扫盲 · Redis 分布式锁》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

数据库索引设计原则

1. 概述 索引是优化数据库性能最重要的工具之一。但是&#xff0c;创建过多的索引或索引错误的列也会对性能产生负面影响。因此&#xff0c;在设计索引时遵循一定的原则很重要。 2. 原则A - 根据工作负载创建索引 创建高效索引最重要的原则是根据您的工作负载而不是表结构创…

数据库连接池的深入学习

为什么需要数据库连接池&#xff1f; 正常操作数据库需要对其进行连接&#xff0c;访问数据库&#xff0c;执行sql语句&#xff0c;断开连接。 创建数据库连接是一个昂贵的过程&#xff0c;在高并发的情况下&#xff0c;频繁的创建数据库的连接可能会导致数据库宕机。 有了连…

Leetcode JAVA刷刷站(8)字符串转换整数

一、题目概述 二、思路方向 要实现这个功能&#xff0c;我们可以遵循以下步骤来编写 myAtoi 函数&#xff1a; 去除前导空格&#xff1a;使用循环或字符串的 trim() 方法&#xff08;虽然直接操作字符串更高效的方式是使用循环&#xff09;。检查符号&#xff1a;记录第一个非…

TGANet部分复现

Kvasir-SEG复现结果 M e t h o d m I o U m D S C R e c a l l P r e c i s i o n F 2 P r a N e t − − − − − − 0.9663704860609511 − − T G A N e t 0.8331 0.8982 0.9132 − − 0.9029 \begin{array}{lccccr} Method&mIoU&mDSC&Recall&Precision&a…