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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Clip结合Faiss+Flask简易版文搜图服务

一、实现 使用目录结构&#xff1a; templates ---upload.html faiss_app.py 前端代码&#xff1a;upload.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&quo…

Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)

Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号&#xff1a;正点原子的IMX6ULL-alpha开发板。ubuntu版本为&#xff1a;20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯&#xff0c;可以通过read系统调用可以…

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?

随着容器技术的日渐成熟&#xff0c;不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面&#xff0c;很多运维人员都更熟悉虚拟化环境&#xff0c;对“容器圈”的各种概念容易混淆&#xff1a;容器就是 Kubernetes 吗&#xff1f;容器云又是什么&#xff1f;容器…

《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期

消除误解&#xff0c;课程资料逐步公开。 复习资料&#xff1a; Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷&#xff1a; 开卷考试&#xff0c;时间&#xff1a; 2024年11月16日 001 002 003 004 005 ……………………装………………………

本地音乐服务器(三)

6. 删除音乐模块设计 6.1 删除单个音乐 1. 请求响应设计 2. 开始实现 首先在musicmapper新增操作 Music findMusicById(int id);int deleteMusicById(int musicId); 其次新增相对应的.xml代码&#xff1a; <select id"findMusicById" resultType"com.exa…

如何在项目中用elementui实现分页器功能

1.在结构部分复制官网代码&#xff1a; <template> 标签: 这是 Vue 模板的根标签&#xff0c;包含所有的 HTML 元素和 Vue 组件。 <div> 标签: 这是一个普通的 HTML 元素&#xff0c;包裹了 el-pagination 组件。它没有特别的意义&#xff0c;只是为了确保 el-pagi…

VB.Net笔记-更新ing

1.1 设置默认VS的开发环境为VB.NET&#xff08;2024/11/18&#xff09; 1.2 新建一个“Hello&#xff0c;world”的窗体&#xff08;2024/11/18&#xff09; 1.3 计算圆面积的小程序&#xff08;2024/11/18&#xff09; 显示/隐式 声明 &#xff08;2024/11/18&#xff0…

每日一练:【优先算法】双指针之移动零(easy)

双指针概念介绍 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是左右指针。 对撞指针&#xff1a;一般用于顺序结构中&#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最右端开始&#xff0c;然后逐渐…

树状数组 Color the ball hdu 1556 线段树 洛谷p3372

目录 前言 树状数组 lowbit函数 直观表述 代码 运行结果 树状数组构建代码 树状数组的应用 单点修改和&#xff08;单点&#xff09;区间查询 结合差分数组区间修改 ,单点查询 差分数组 Color the ball hdu 1556 问题描述 问题分析 代码 线段树 洛谷p3372 问题描述 问题…

学习笔记022——Ubuntu 安装 MySQL8.0版本踩坑记录

目录 1、查看可安装 MySQL 版本 2、Ubuntu安装 MySQL8.0 3、MySQL8.0 区分大小写问题 4、MySQL8.0 设置sql_mode 5、MySQL8.0 改端口33060&#xff08;个人遇到问题&#xff09; 1、查看可安装 MySQL 版本 ## 列出可用的MySQL版本&#xff08;列出所有可用的MySQL版本以…

【数据结构】树——链式存储二叉树的基础

写在前面 书接上文&#xff1a;【数据结构】树——顺序存储二叉树 本篇笔记主要讲解链式存储二叉树的主要思想、如何访问每个结点、结点之间的关联、如何递归查找每个结点&#xff0c;为后续更高级的树形结构打下基础。不了解树的小伙伴可以查看上文 文章目录 写在前面 一、链…

qt之QFTP对文件夹(含嵌套文件夹和文件)、文件删除下载功能

一、前言 主要功能如下&#xff1a; 1.实现文件夹的下载和删除&#xff0c;网上很多资料都是单独对某个路径的文件操作的&#xff0c;并不能对文件夹操作 2.实现目标机中含中文名称自动转码&#xff0c;有些系统编码方式不同&#xff0c;下载出来的文件会乱码 3.实现ftp功能…

集群聊天服务器(7)数据模块

目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库&#xff0c;因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql&#xff0c;想存redis的话&#xff0c;就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…

手机远程控制电脑,让办公更快捷

在数字化办公的浪潮下&#xff0c;远程控制软件已成为连接工作与生活的桥梁。它使得用户能够通过一台设备&#xff08;主控端&#xff09;来操作另一台设备&#xff08;被控端&#xff09;&#xff0c;无论它们是否位于同一局域网内。这种软件广泛应用于远程办公、手机远程控制…

面向FWA市场!移远通信高性能5G-A模组RG650V-NA通过北美两大重要运营商认证

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;其旗下符合3GPP R17标准的新一代5G-A模组RG650V-NA成功通过了北美两家重要运营商认证。凭借高速度、大容量、低延迟、高可靠等优势&#xff0c;该模组可满足CPE、家庭/企业网关、移动热点、高清视频…

72项!湖北省2024年度第二批省级科技计划项目拟立项项目公示!

本期精选 SCI&EI ●IEEE 1区TOP 计算机类&#xff08;含CCF&#xff09;&#xff1b; ●EI快刊&#xff1a;最快1周录用&#xff01; 知网(CNKI)、谷歌学术期刊 ●7天录用-检索&#xff08;100%录用&#xff09;&#xff0c;1周上线&#xff1b; 免费稿件评估 免费匹配…

LeetCode 热题 100 回顾

目录 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 2.字母异位词分组 &#xff08;中等&#xff09; 3.最长连续序列 &#xff08;中等&#xff09; 二、双指针部分 4.移动零 &#xff08;简单&#xff09; 5.盛最多水的容器 &#xff08;中等&#xff09; 6…

Chrome 浏览器 131 版本开发者工具(DevTools)更新内容

Chrome 浏览器 131 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、使用 Gemini 调试 CSS Chrome DevTools 现在推出了一个新的实验性 AI 辅助面板&#xff0c;可以与 Gemini 聊天并获得帮助来调试 CSS。 在 Elements 面板中&#xff0c;右键点击一个元素并选…

网络编程-002-UDP通信

1.UDP通信的简单介绍 1.1不需要通信握手,无需维持连接,网络带宽需求较小,而实时性要求高 1.2 包大小有限制,不发大于路径MTU的数据包 1.3容易丢包 1.4 可以实现一对多,多对多 2.客户端与服务端=发送端与接收端 代码框架 收数据方一般都是客户端/接收端 3.头文件 #i…

websocket身份验证

websocket身份验证 前言 上一集我们就完成了websocket初始化的任务&#xff0c;那么我们完成这个内容之后就应该完成一个任务&#xff0c;当客户端与服务端连接成功之后&#xff0c;客户端应该主动发起一个身份认证的消息。 身份认证proto 我们看一眼proto文件的内容。 我…