Java 设计模式 详解

ops/2024/11/20 22:38:15/

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


http://www.ppmy.cn/ops/135342.html

相关文章

Android开发实战班 - Android开发基础之 Kotlin语言基础与特性

Kotlin 是一种现代化的编程语言,由 JetBrains 开发,现已成为 Android 官方支持的开发语言。相比于 Java,Kotlin 提供了更简洁、安全和高效的语法特性,极大地提升了开发效率。本章节将深入讲解 Kotlin 的基础语法和核心特性&#x…

Windows配置域名映射IP

一、找到 hosts 文件 打开 C:\Windows\System32\drivers\etc 二、添加hosts文件修改、写入权限 右击hosts文件,点击属性 -> 安全 -> Users -> 编辑 -> Users -> 添加修改、写入权限 -> 确定 -> 确定 进入常规,将只读属性关闭 三、…

【NodeJS】Node.js是什么?能做什么?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区:个人社区 💞 个人主页:个人主页 🙉 专栏地址: ✅ Java 中级 🙉八股文专题:剑指大厂,手撕 J…

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

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

Redis作为分布式锁,得会避坑

日常开发中,经常会碰到秒杀抢购等业务场景。为了避免并发请求造成的库存超卖等问题,我们一般会用到Redis分布式锁。但是使用Redis分布式锁之前要知道有哪些坑是需要我们避过去的。 1. 非原子操作(setnx expire) 一说到实现Redis…

从cityengine到unreal,游戏引擎助力城市设计

目前在ce端已经可以从路网中线快速通过规则转换为街道,并且在生成的block中通过vcga编辑器快速做到想要的效果。 相对来说,还是twinmotion中替换模型和材质要方便一些,ue太复杂了。 下一步试试怎么把那个第三人称的小人,还有…

基于机器学习电信号EMG训练分类模型控制仿生手控制系统(Matlab-Simulink实现)

基于机器学习电信号EMG训练分类模型控制仿生手控制系统(Matlab-Simulink实现) 引言 随着生物医学工程和机器学习技术的发展,仿生手控制系统的研发取得了显著进展。本文将介绍如何利用机器学习方法,通过肌电图(Electr…

代码随想录算法训练营第五十一天|Day51 图论

岛屿数量 深搜 https://www.programmercarl.com/kamacoder/0099.%E5%B2%9B%E5%B1%BF%E7%9A%84%E6%95%B0%E9%87%8F%E6%B7%B1%E6%90%9C.html 思路 #include <stdio.h> #define MAX_SIZE 50 int grid[MAX_SIZE][MAX_SIZE]; int visited[MAX_SIZE][MAX_SIZE]; int N, M; …