当前位置: 首页 > news >正文

Java 设计模式 详解

在Java开发中,设计模式是一种常见的、成熟的解决方案,用于应对特定的设计问题和复杂性管理。以下是一些常用的设计模式,它们可以分为三类:创建型模式、结构型模式和行为型模式。

一、创建型模式

创建型模式主要负责对象的创建,能够将对象的创建过程与使用过程分离,避免过度依赖具体类的构造。

  1. 单例模式(Singleton Pattern)

    • 确保一个类只有一个实例,并提供一个全局访问点。
    • 使用场景:数据库连接、配置管理、线程池等。
  2. 工厂方法模式(Factory Method Pattern)

    • 定义一个接口用于创建对象,但让子类决定实例化哪一个类。工厂方法将实例化过程延迟到子类。
    • 使用场景:需要创建复杂对象时,可以通过不同的工厂来灵活生产。
  3. 抽象工厂模式(Abstract Factory Pattern)

    • 提供一个创建一系列相关或依赖对象的接口,而无需指定它们的具体类。
    • 使用场景:产品族的创建,如一整套UI组件(按钮、文本框等)等。
  4. 建造者模式(Builder Pattern)

    • 将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
    • 使用场景:构建复杂对象,比如包含多种属性的对象或多步构建流程。
  5. 原型模式(Prototype Pattern)

    • 通过复制现有实例来创建新对象,而不是通过实例化。
    • 使用场景:当创建对象的成本较高,且我们可以复制已有对象来生成新实例时。

二、结构型模式

结构型模式用于处理类或对象之间的关系,通过继承或组合的方式使得系统更具灵活性。

  1. 适配器模式(Adapter Pattern)

    • 将一个类的接口转换成客户端期望的另一个接口,使得原本不兼容的类可以一起工作。
    • 使用场景:系统需要使用新旧接口兼容的类。
  2. 装饰器模式(Decorator Pattern)

    • 动态地给对象添加额外的职责,而不改变其结构。
    • 使用场景:扩展类的功能,而无需创建子类。
  3. 代理模式(Proxy Pattern)

    • 提供一个代理对象来控制对原对象的访问,保护原对象或增加额外操作。
    • 使用场景:权限控制、对象的延迟加载、缓存等。
  4. 外观模式(Facade Pattern)

    • 为子系统中的一组接口提供一个统一的接口,简化对复杂子系统的使用。
    • 使用场景:简化客户端调用多个复杂的子系统。
  5. 享元模式(Flyweight Pattern)

    • 通过共享技术有效地支持大量的细粒度对象,减少内存开销。
    • 使用场景:需要大量重复对象时,如文本处理中的字符对象。
  6. 组合模式(Composite Pattern)

    • 将对象组合成树形结构以表示“部分-整体”的层次结构,客户端可以统一对待单个对象和组合对象。
    • 使用场景:处理树形结构的数据,如文件目录。

三、行为型模式

行为型模式关注对象之间的协作和职责分配,帮助处理对象之间的交互。

  1. 策略模式(Strategy Pattern)

    • 定义一系列算法,将它们封装起来,使它们可以互相替换,客户端可以灵活地选择算法。
    • 使用场景:多个算法可以互换,例如不同的排序策略。
  2. 模板方法模式(Template Method Pattern)

    • 在父类中定义一个算法的骨架,而将一些步骤延迟到子类中。
    • 使用场景:一些操作步骤不可改变,但细节不同。
  3. 观察者模式(Observer Pattern)

    • 定义对象间的一对多依赖关系,当一个对象状态发生改变时,所有依赖它的对象都能自动更新。
    • 使用场景:订阅-发布系统,如新闻订阅、事件处理。
  4. 责任链模式(Chain of Responsibility Pattern)

    • 让多个对象有机会处理请求,将这些对象串成一条链,并沿着这条链传递请求。
    • 使用场景:权限过滤、事件处理链。
  5. 命令模式(Command Pattern)

    • 将请求封装成一个对象,以便使用不同的请求、队列、日志等来进行参数化。
    • 使用场景:事务管理、日志请求恢复、撤销操作。
  6. 状态模式(State Pattern)

    • 允许对象在内部状态改变时改变它的行为,使得对象看起来改变了其类。
    • 使用场景:状态机设计,如电梯系统、自动售货机。
  7. 备忘录模式(Memento Pattern)

    • 在不破坏封装的前提下,捕获对象的内部状态,以便在将来恢复。
    • 使用场景:撤销操作、恢复状态。
  8. 迭代器模式(Iterator Pattern)

    • 提供一种方法顺序访问集合中的元素,而无需暴露集合的内部表示。
    • 使用场景:集合遍历,Java的Iterator就是此模式的实现。
  9. 中介者模式(Mediator Pattern)

    • 定义一个对象来封装一组对象之间的交互关系,避免对象之间的直接引用,使得耦合松散。
    • 使用场景:GUI控件之间的交互,聊天应用中的消息路由。
  10. 解释器模式(Interpreter Pattern)

    • 为某个语言定义文法表示,并提供一个解释器来处理这些文法。
    • 使用场景:SQL解析、正则表达式解释、脚本语言处理。

总结

在Java开发中,不同的设计模式可以帮助我们应对不同的设计挑战,从而实现高效、灵活且易维护的系统结构。在实际应用中,通常会结合多种模式来满足复杂的需求,选择合适的模式可以大大提升代码的可读性和复用性。

相关文章:

Java 设计模式 详解

在Java开发中,设计模式是一种常见的、成熟的解决方案,用于应对特定的设计问题和复杂性管理。以下是一些常用的设计模式,它们可以分为三类:创建型模式、结构型模式和行为型模式。 一、创建型模式 创建型模式主要负责对象的创建&a…...

卡尔曼滤波学习资料汇总

卡尔曼滤波学习资料汇总 其实,当初的目的,是为了写 MPU6050 的代码的,然后不知不觉学了那么多,也是因为好奇、感兴趣吧 有些还没看完,之后笔记也会同步更新的 学习原始材料 【卡尔曼滤波器】1_递归算法_Recursive P…...

linux003.在ubuntu中安装cmake的方法

1.cmake安装程序下载 https://cmake.org/files/v3.30/ 2.解压并下载包 解压cmake压缩包 tar -xvzf cmake.tar.gz进入解压目录 cd cmake-<version>编辑~/.bashrc nano ~/.bashrc在文件的末尾添加如下代码 export PATH/home/xwl/software/cmake/bin:$PATH然后运行以…...

EtherNet/IP转Profinet网关连接发那科机器人配置实例解析

本案例主要展示了如何通过Ethernet/IP转Profinet网关实现西门子1200PLC与发那科搬运机器人的连接。所需的设备有西门子1200PLC、开疆智能Ethernet/IP转Profinet网关以及Fanuc机器人。 具体配置步骤&#xff1a;打开西门子博图配置软件&#xff0c;添加PLC。这是配置的第一步&am…...

自动化运维-检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型等信息脚本

前言&#xff1a;以上脚本为今年8月1号发布的&#xff0c;当时是没有任何问题&#xff0c;但现在脚本里网络速度测试py文件获取不了了&#xff0c;测速这块功能目前无法实现&#xff0c;后面我会抽时间来研究&#xff0c;大家如果有建议也可以分享下。 脚本内容&#xff1a; #…...

ubuntu24.04设置开机自启动Eureka

ubuntu24.04设置开机自启动Eureka 之前我们是在/root/.bashrc的文件中增加了一条命令 nohup java -jar /usr/software/eurekaServer-auth-prd-03.jar > /usr/software/log.log 2>&1 &但上面这条命令只有在登录root的用户时&#xff0c;才会执行&#xff0c;如果…...

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…...

工化企业内部能源能耗过大 落实能源管理

一、精准监测与数据分析 实时准确的数据采集 企业能耗管理系统能够对企业内各种能源&#xff08;如电、水、气、热等&#xff09;的使用情况进行实时监测。通过安装在能源供应线路和设备上的智能传感器&#xff0c;可以精确地采集能源消耗的各项数据&#xff0c;包括瞬时流量、…...

LSTM 和 LSTMCell

1. LSTM 和 LSTMCell 的简介 LSTM (Long Short-Term Memory): 一种特殊的 RNN&#xff08;循环神经网络&#xff09;&#xff0c;用于解决普通 RNN 中 梯度消失 或 梯度爆炸 的问题。能够捕获 长期依赖关系&#xff0c;适合处理序列数据&#xff08;如自然语言、时间序列等&…...

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…...

解决docker报Error response from daemon Get httpsregistry-1.docker.iov2错误

解决docker报Error response from daemon: Get "https://registry-1.docker.io/v2/"错误 报错详情 首先先看一下问题报错效果,我想要拉去nacos-serve&#xff1a;1.1.4的镜像&#xff0c;报如下错误&#xff0c;从报错信息可以看到&#xff0c;用于网络的愿意&…...

【论文分享】利用多源大数据衡量街道步行环境的老年友好性:以中国上海为例

本次给大家带来一篇SCI论文的全文翻译&#xff01;该论文考虑了绿化程度、可步行性、安全性、形象性、封闭性和复杂性这六个指标&#xff0c;提出了一种基于多源地理空间大数据的新型定量评价模型&#xff0c;用于从老年人和专家的角度评估街道步行环境的老年友好程度&#xff…...

说说软件工程中的“协程”

在软件工程中&#xff0c;协程&#xff08;coroutine&#xff09;是一种程序运行的方式&#xff0c;可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释&#xff1a; 一、协程的基本概念 定义&#xff1a;协程是一组序列化的子过程&#xff0c;用户能像指挥家…...

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时&#xff0c;有些时候&#xff0c;需要和第三方进行调式&#xff0c;但是第三方不在一起&#xff0c;需要进行远程调试&…...

javaScript交互案例2

1、京东侧边导航条 需求&#xff1a; 原先侧边栏是绝对定位当页面滚动到一定位置&#xff0c;侧边栏改为固定定位页面继续滚动&#xff0c;会让返回顶部显示出来 思路&#xff1a; 需要用到页面滚动事件scroll&#xff0c;因为是页面滚动&#xff0c;所以事件源是document滚动…...

JavaScript 浏览器对象模型 BOM

浏览器对象模型&#xff08;Browser Object Model&#xff0c;BOM&#xff09;是指一组与浏览器进行交互的 JavaScript 对象。它允许 JavaScript 与浏览器的组件进行交互&#xff0c;比如窗口、文档、历史记录等。BOM 不同于 DOM&#xff08;文档对象模型&#xff09;&#xff…...

基于MATLAB的激光雷达与相机联合标定原理及实现方法——以标定板为例

1.为什么要进行激光雷达和相机的联合标定&#xff1f; 激光雷达和相机的联合标定是为了将两种传感器的数据统一到同一坐标系中&#xff0c;从而实现更准确的环境感知。激光雷达提供精准的三维距离信息&#xff0c;而相机捕捉丰富的纹理和颜色&#xff0c;通过联合标定可以结合两…...

React(一)

文章目录 项目地址一、创建第一个react项目二、JSX语法2.1 生成列表2.2 大括号识别JS的表达式2.3 列表循环array2.4 条件判断以及假值显示2.5 复杂条件渲染2.6 事件处理2.7 添加CSS样式2.8 添加图片2.9 使用Fregments返回多个根标签2.10多条件渲染2.11 导出子组件2.12 给子组件…...

Liunx-Ubuntu22.04.1系统下配置Anaconda+pycharm+pytorch-gpu环境配置

这里写自定义目录标题 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置一、Anaconda3配置1.Anaconda安装2.Anaconda更新3.Anaconda删除 二、pycharm配置1.pycharm安装 三、pytorch配置 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置 一…...

Postman之数据提取

Postman之数据提取 1. 提取请求头\request中的数据2. 提取响应消息\response中的数据3. 通过正在表达式提取4. 提取cookies数据 本文主要讲解利用pm对象对数据进行提取操作&#xff0c;虽然postman工具的页面上也提供了一部分的例子&#xff0c;但是实际使用时不是很全面&#…...

selenium元素定位校验以及遇到的元素操作问题记录

页面元素定位方法及校验 使用比较多的是通过id、class和xpath来对元素进行定位。在定位前可以现在浏览器验证是否可以找到指定的元素。这样就不用每添加一个元素定位都运行代码来检查定位方式表达式是否正确。 使用XPATH定位 在浏览器F12&#xff0c;找到元素&#xff0c;在元…...

在AndroidStudio中新建项目时遇到的Gradle下载慢问题,配置错的按我的来,镜像地址不知道哪个网页找的,最主要下载要快

android-studio-2024.2.1.11-windows Android 移动应用开发者工具 – Android 开发者 | Android Developers https://r4---sn-j5o76n7z.gvt1-cn.com/edgedl/android/studio/install/2024.2.1.11/android-studio-2024.2.1.11-windows.exe?cms_redirectyes&met1731775…...

用mv命令替换rm命令

# 用mv命令替换rm命令 主要内容来源自以上博文 rm命令穷凶极恶&#xff0c;以下为替换命令的方式&#xff0c;必做 步骤 修改vim ~/.bashrc加入以下代码 mkdir -p ~/.trash #在家目录下创建一个.trash文件夹(隐藏文件&#xff0c;ls -a 查看) alias rmdel #使用别名…...

电解车间铜业机器人剥片技术是现代铜冶炼过程中自动化和智能化的重要体现

电解车间铜业机器人剥片技术是现代铜冶炼过程中自动化和智能化的重要体现 电解车间铜业机器人剥片技术是现代铜冶炼过程中自动化和智能化的重要体现&#xff0c;它主要应用于铜电解精炼的最后阶段&#xff0c;即从阴极板上剥离出纯铜的过程。以下是该技术的几个关键点&#xff…...

【qt】控件2

1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算&#xff0c;Geometry从黑圈算 程序证明&#xff1a;使用一个按键&#xff0c;当按键按下,qdebug打印各自左上角的坐标&#xff08;相当于屏幕左上角&#xff09;&#xff0c;以及窗口大小 Widget::Widget(QWid…...

Frida反调试对抗系列(四)百度加固

本文只是交流技术&#xff0c;如有侵权请联系我删除。 知识星球&#xff1a;https://t.zsxq.com/kNlj4 前言&#xff1a; 上一篇文章我们提到 我们使用github开源魔改好的frida server 但是仍然有一些厂商的server不能通过&#xff0c;那么这篇文章针对百度加固 进行快速通…...

Redis 安全

Redis 安全 Redis是一个开源的&#xff0c;高性能的键值存储系统&#xff0c;它通常被用作数据库&#xff0c;缓存和消息代理。由于其高性能和简单的API&#xff0c;Redis在全球范围内被广泛使用。然而&#xff0c;与其他数据库系统一样&#xff0c;Redis的安全性也是至关重要…...

上交大与上海人工智能研究所联合推出医学多语言模型,模型数据代码开源

今天为大家介绍的是来自上海交通大学的王延峰与谢伟迪团队的一篇论文。开源的多语言医学语言模型的发展可以惠及来自不同地区、语言多样化的广泛受众。 来源丨 DrugAI、 机器人的脑电波 论文&#xff1a;https://www.nature.com/articles/s41467-024-52417-z MMedC&#xff1…...

网络安全:我们的安全防线

在数字化时代&#xff0c;网络安全已成为国家安全、经济发展和社会稳定的重要组成部分。网络安全不仅仅是技术问题&#xff0c;更是一个涉及政治、经济、文化、社会等多个层面的综合性问题。从宏观到微观&#xff0c;网络安全的重要性不言而喻。 宏观层面&#xff1a;国家安全与…...

理解 Python 中的 __getitem__ 方法:在自定义类中启用索引和切片操作

理解 Python 中的 __getitem__ 方法&#xff1a;在自定义类中启用索引和切片操作 在Python中&#xff0c;__getitem__是一个特殊方法&#xff0c;属于数据模型方法之一&#xff0c;它使得Python对象能够支持下标访问和切片操作。这个方法提供了一种机制&#xff0c;允许类的实…...