Java 设计模式 详解
在Java开发中,设计模式是一种常见的、成熟的解决方案,用于应对特定的设计问题和复杂性管理。以下是一些常用的设计模式,它们可以分为三类:创建型模式、结构型模式和行为型模式。
一、创建型模式
创建型模式主要负责对象的创建,能够将对象的创建过程与使用过程分离,避免过度依赖具体类的构造。
-
单例模式(Singleton Pattern)
- 确保一个类只有一个实例,并提供一个全局访问点。
- 使用场景:数据库连接、配置管理、线程池等。
-
工厂方法模式(Factory Method Pattern)
- 定义一个接口用于创建对象,但让子类决定实例化哪一个类。工厂方法将实例化过程延迟到子类。
- 使用场景:需要创建复杂对象时,可以通过不同的工厂来灵活生产。
-
抽象工厂模式(Abstract Factory Pattern)
- 提供一个创建一系列相关或依赖对象的接口,而无需指定它们的具体类。
- 使用场景:产品族的创建,如一整套UI组件(按钮、文本框等)等。
-
建造者模式(Builder Pattern)
- 将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
- 使用场景:构建复杂对象,比如包含多种属性的对象或多步构建流程。
-
原型模式(Prototype Pattern)
- 通过复制现有实例来创建新对象,而不是通过实例化。
- 使用场景:当创建对象的成本较高,且我们可以复制已有对象来生成新实例时。
二、结构型模式
结构型模式用于处理类或对象之间的关系,通过继承或组合的方式使得系统更具灵活性。
-
适配器模式(Adapter Pattern)
- 将一个类的接口转换成客户端期望的另一个接口,使得原本不兼容的类可以一起工作。
- 使用场景:系统需要使用新旧接口兼容的类。
-
装饰器模式(Decorator Pattern)
- 动态地给对象添加额外的职责,而不改变其结构。
- 使用场景:扩展类的功能,而无需创建子类。
-
代理模式(Proxy Pattern)
- 提供一个代理对象来控制对原对象的访问,保护原对象或增加额外操作。
- 使用场景:权限控制、对象的延迟加载、缓存等。
-
外观模式(Facade Pattern)
- 为子系统中的一组接口提供一个统一的接口,简化对复杂子系统的使用。
- 使用场景:简化客户端调用多个复杂的子系统。
-
享元模式(Flyweight Pattern)
- 通过共享技术有效地支持大量的细粒度对象,减少内存开销。
- 使用场景:需要大量重复对象时,如文本处理中的字符对象。
-
组合模式(Composite Pattern)
- 将对象组合成树形结构以表示“部分-整体”的层次结构,客户端可以统一对待单个对象和组合对象。
- 使用场景:处理树形结构的数据,如文件目录。
三、行为型模式
行为型模式关注对象之间的协作和职责分配,帮助处理对象之间的交互。
-
策略模式(Strategy Pattern)
- 定义一系列算法,将它们封装起来,使它们可以互相替换,客户端可以灵活地选择算法。
- 使用场景:多个算法可以互换,例如不同的排序策略。
-
模板方法模式(Template Method Pattern)
- 在父类中定义一个算法的骨架,而将一些步骤延迟到子类中。
- 使用场景:一些操作步骤不可改变,但细节不同。
-
观察者模式(Observer Pattern)
- 定义对象间的一对多依赖关系,当一个对象状态发生改变时,所有依赖它的对象都能自动更新。
- 使用场景:订阅-发布系统,如新闻订阅、事件处理。
-
责任链模式(Chain of Responsibility Pattern)
- 让多个对象有机会处理请求,将这些对象串成一条链,并沿着这条链传递请求。
- 使用场景:权限过滤、事件处理链。
-
命令模式(Command Pattern)
- 将请求封装成一个对象,以便使用不同的请求、队列、日志等来进行参数化。
- 使用场景:事务管理、日志请求恢复、撤销操作。
-
状态模式(State Pattern)
- 允许对象在内部状态改变时改变它的行为,使得对象看起来改变了其类。
- 使用场景:状态机设计,如电梯系统、自动售货机。
-
备忘录模式(Memento Pattern)
- 在不破坏封装的前提下,捕获对象的内部状态,以便在将来恢复。
- 使用场景:撤销操作、恢复状态。
-
迭代器模式(Iterator Pattern)
- 提供一种方法顺序访问集合中的元素,而无需暴露集合的内部表示。
- 使用场景:集合遍历,Java的
Iterator就是此模式的实现。
-
中介者模式(Mediator Pattern)
- 定义一个对象来封装一组对象之间的交互关系,避免对象之间的直接引用,使得耦合松散。
- 使用场景:GUI控件之间的交互,聊天应用中的消息路由。
-
解释器模式(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机器人。 具体配置步骤:打开西门子博图配置软件,添加PLC。这是配置的第一步&am…...
自动化运维-检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型等信息脚本
前言:以上脚本为今年8月1号发布的,当时是没有任何问题,但现在脚本里网络速度测试py文件获取不了了,测速这块功能目前无法实现,后面我会抽时间来研究,大家如果有建议也可以分享下。 脚本内容: #…...
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的用户时,才会执行,如果…...
从视频帧生成点云数据、使用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:…...
工化企业内部能源能耗过大 落实能源管理
一、精准监测与数据分析 实时准确的数据采集 企业能耗管理系统能够对企业内各种能源(如电、水、气、热等)的使用情况进行实时监测。通过安装在能源供应线路和设备上的智能传感器,可以精确地采集能源消耗的各项数据,包括瞬时流量、…...
LSTM 和 LSTMCell
1. LSTM 和 LSTMCell 的简介 LSTM (Long Short-Term Memory): 一种特殊的 RNN(循环神经网络),用于解决普通 RNN 中 梯度消失 或 梯度爆炸 的问题。能够捕获 长期依赖关系,适合处理序列数据(如自然语言、时间序列等&…...
python成长技能之正则表达式
文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式(英语&…...
解决docker报Error response from daemon Get httpsregistry-1.docker.iov2错误
解决docker报Error response from daemon: Get "https://registry-1.docker.io/v2/"错误 报错详情 首先先看一下问题报错效果,我想要拉去nacos-serve:1.1.4的镜像,报如下错误,从报错信息可以看到,用于网络的愿意&…...
【论文分享】利用多源大数据衡量街道步行环境的老年友好性:以中国上海为例
本次给大家带来一篇SCI论文的全文翻译!该论文考虑了绿化程度、可步行性、安全性、形象性、封闭性和复杂性这六个指标,提出了一种基于多源地理空间大数据的新型定量评价模型,用于从老年人和专家的角度评估街道步行环境的老年友好程度ÿ…...
说说软件工程中的“协程”
在软件工程中,协程(coroutine)是一种程序运行的方式,可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释: 一、协程的基本概念 定义:协程是一组序列化的子过程,用户能像指挥家…...
使用IDE实现java端远程调试功能
使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时,有些时候,需要和第三方进行调式,但是第三方不在一起,需要进行远程调试&…...
javaScript交互案例2
1、京东侧边导航条 需求: 原先侧边栏是绝对定位当页面滚动到一定位置,侧边栏改为固定定位页面继续滚动,会让返回顶部显示出来 思路: 需要用到页面滚动事件scroll,因为是页面滚动,所以事件源是document滚动…...
JavaScript 浏览器对象模型 BOM
浏览器对象模型(Browser Object Model,BOM)是指一组与浏览器进行交互的 JavaScript 对象。它允许 JavaScript 与浏览器的组件进行交互,比如窗口、文档、历史记录等。BOM 不同于 DOM(文档对象模型)ÿ…...
基于MATLAB的激光雷达与相机联合标定原理及实现方法——以标定板为例
1.为什么要进行激光雷达和相机的联合标定? 激光雷达和相机的联合标定是为了将两种传感器的数据统一到同一坐标系中,从而实现更准确的环境感知。激光雷达提供精准的三维距离信息,而相机捕捉丰富的纹理和颜色,通过联合标定可以结合两…...
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对象对数据进行提取操作,虽然postman工具的页面上也提供了一部分的例子,但是实际使用时不是很全面&#…...
OpenClaw长文本优化:Qwen3-32B-RTX4090D处理百万字小说的技巧
OpenClaw长文本优化:Qwen3-32B-RTX4090D处理百万字小说的技巧 1. 为什么选择Qwen3-32B处理长文本 当我第一次尝试用OpenClaw处理百万字小说时,遇到了两个致命问题:一是常规8K上下文窗口连完整章节都装不下,二是模型在长文本推理…...
零代码玩转视觉定位:基于Qwen2.5-VL的Chord模型,Gradio界面快速上手
零代码玩转视觉定位:基于Qwen2.5-VL的Chord模型,Gradio界面快速上手 1. 视觉定位技术简介 视觉定位(Visual Grounding)是一项让计算机能够理解自然语言描述并在图像中精确定位目标对象的技术。想象一下,当你对计算机…...
.NET eShop 开源项目教程
.NET eShop 开源项目教程 【免费下载链接】eShop A reference .NET application implementing an eCommerce site 项目地址: https://gitcode.com/GitHub_Trending/es/eShop 1. 项目介绍 .NET eShop 是一个基于 Microsoft 的 .NET 技术栈开发的开源电子商务平台。该项目…...
GME多模态向量模型助力AI编程:代码与注释的跨模态理解工具
GME多模态向量模型助力AI编程:代码与注释的跨模态理解工具 1. 引言:当代码能听懂人话 你有没有过这样的经历?面对一个庞大的代码库,想找一个实现特定功能的函数,却记不清它的名字,只能靠模糊的记忆在文件…...
从服务边界到性能边界:理解 ABAP CDS View 里的窄投影及其重要性
结论先讲清楚 在 ABAP CDS 语境里,很多开发者口中的 窄投影,本质上并不是一个独立的官方语法关键字,而是一种建模策略:在 CDS projection view 这一层,只暴露某个具体业务服务真正需要的那一小部分字段、关联、行为和注解,不把底层业务对象里所有能拿到的内容一股脑端出…...
从‘文化进化’到AI调参:Memetic算法在机器学习超参数优化中的实战指南
Memetic算法:机器学习超参数优化的进化革命 当你的神经网络在验证集上表现停滞不前,当XGBoost的网格搜索消耗了三天三夜却收效甚微,或许该换个视角看待调参这个"玄学"问题了。Memetic算法——这个融合了达尔文进化论与文化传播智慧…...
嵌入式NMEA-0183零内存分配解析器设计与实现
1. NMEA-0183 协议解析库深度技术解析:面向嵌入式系统的轻量级、零内存分配实现 NMEA-0183(National Marine Electronics Association 0183)是全球航海电子设备事实上的标准通信协议,自1983年发布以来,已广泛应用于GPS…...
如何选择性价比高的宁波小程序开发服务公司?
在选择宁波小程序开发服务公司的过程中,内容概要的作用不可忽视。首先,应该明确找到一家能够提供专业服务的公司,同时懂得满足特定行业需求。此类公司通常拥有多样化的项目经验,可以展现出他们在不同领域的实际操作能力。有时候&a…...
ST25DV64KC动态NFC标签Arduino驱动库详解
1. 项目概述SparkFun ST25DV64KC Arduino Library 是面向 ST25DV64KC 动态 NFC/RFID 标签的专用驱动库,专为 Qwiic 生态系统中的 SparkFun Qwiic Dynamic RFID Tag(型号 SPX-19035)设计。该库并非通用 NFC 协议栈,而是深度适配 ST…...
政务大模型微调全攻略,打造高效智能政务AI系统!
在数字化、智能化成为新质生产力核心驱动力,十五五政务数字化转型加速推进的背景下,智慧政务建设成为各地政府提升治理能力的关键。但当前政务领域普遍面临数据处理效率低、AI 模型适配性差、服务自动化水平不足、敏感数据管理难等痛点,通用大…...
