当前位置: 首页 > 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;但是实际使用时不是很全面&#…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…...