Java设计模式:系统性解析与核心模式


一、设计模式三大分类总览

  1. 创建型模式(5种)
    核心目标:对象创建的优化与解耦

单例模式(Singleton)

工厂模式(Factory)

抽象工厂模式(Abstract Factory)

建造者模式(Builder)

原型模式(Prototype)

  1. 结构型模式(7种)
    核心目标:类与对象组合的灵活架构

适配器模式(Adapter)

装饰器模式(Decorator)

代理模式(Proxy)

外观模式(Facade)

桥接模式(Bridge)

组合模式(Composite)

享元模式(Flyweight)

  1. 行为型模式(11种)
    核心目标:对象间的交互与职责分配

观察者模式(Observer)

策略模式(Strategy)

命令模式(Command)

责任链模式(Chain of Responsibility)

状态模式(State)

模板方法模式(Template Method)

迭代器模式(Iterator)

中介者模式(Mediator)

备忘录模式(Memento)

访问者模式(Visitor)

解释器模式(Interpreter)

二、创建型模式深度解析

1. 单例模式(Singleton)——对象创建的终极控制

核心特征:全局唯一实例 + 延迟初始化 + 线程安全

演进式实现对比
// 1. 饿汉式(线程安全但立即加载)
public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton();private EagerSingleton() {}public static EagerSingleton getInstance() { return INSTANCE; }
}// 2. 双重校验锁(DCL)实现
public class DCLSingleton {private static volatile DCLSingleton instance; // volatile禁止指令重排序private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {                    // 第一次检查synchronized (DCLSingleton.class) {    // 锁粒度控制if (instance == null) {            // 第二次检查instance = new DCLSingleton();  // 安全发布}}}return instance;}
}// 3. 枚举实现(《Effective Java》推荐方式)
public enum EnumSingleton {INSTANCE;public void businessMethod() { /*...*/ }
}

技术深挖

  1. volatile关键字:防止JVM指令重排序导致对象未初始化完成就被使用(JVM规范允许的优化)

  2. 类加载机制:枚举实现利用类加载的线程安全性保证单例

  3. 序列化攻击防御:枚举天然防反射和序列化破坏,普通实现需重写readResolve()

典型应用场景

// Java原生API中的单例
Runtime runtime = Runtime.getRuntime();      // JVM运行时环境单例
Desktop desktop = Desktop.getDesktop();     // 桌面操作单例

2. 工厂模式(Factory)——对象创建的工业化革命

模式演进三阶段
简单工厂 → 工厂方法 → 抽象工厂

工厂方法模式(Factory Method)
// 产品接口
public interface DatabaseConnection {void connect();
}// 具体产品
public class MySQLConnection implements DatabaseConnection {@Override public void connect() { System.out.println("MySQL connected"); }
}// 抽象工厂
public abstract class ConnectionFactory {public abstract DatabaseConnection createConnection();// 模板方法public void initializeConnection() {DatabaseConnection conn = createConnection();conn.connect();// 公共初始化逻辑...}
}// 具体工厂
public class MySQLFactory extends ConnectionFactory {@Overridepublic DatabaseConnection createConnection() {return new MySQLConnection();}
}

Spring框架中的高级应用

<!-- Bean配置工厂方法 -->
<bean id="mysqlFactory" class="com.example.MySQLFactory"/>
<bean id="connection" factory-bean="mysqlFactory" factory-method="createConnection"/>

三、结构型模式实战精讲

1. 适配器模式(Adapter)——接口转换的艺术

两种实现方式对比

类型实现方式适用场景Java示例
类适配器继承被适配类需要复用现有类代码较少使用
对象适配器组合被适配对象更灵活的解耦方式InputStreamReader

JDK中的经典实现

// 将字节流转换为字符流
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

现代Java中的函数式适配

// 使用Lambda适配旧接口
Runnable legacyTask = () -> System.out.println("Old task");
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(legacyTask::run);

2. 装饰器模式(Decorator)——动态增强的利器

模式结构

          Component↑   ↑ConcreteComponent ← Decorator↑ConcreteDecoratorA

Java IO流的装饰器体系

// 多层装饰示例
InputStream in = new FileInputStream("data.txt");
in = new BufferedInputStream(in);          // 添加缓冲功能
in = new GZIPInputStream(in);              // 添加压缩解压功能

自定义装饰器实现

public class CryptoInputStream extends FilterInputStream {private Cipher cipher;public CryptoInputStream(InputStream in, SecretKey key) throws GeneralSecurityException {super(in);cipher = Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE, key);}@Overridepublic int read(byte[] b, int off, int len) throws IOException {int bytesRead = super.read(b, off, len);if (bytesRead > 0) {try {cipher.doFinal(b, off, bytesRead);  // 解密处理} catch (IllegalBlockSizeException | BadPaddingException e) {throw new IOException("Decryption failed", e);}}return bytesRead;}
}

四、行为型模式核心剖析

1. 观察者模式(Observer)——事件驱动的基石

Java内置实现演进

// 传统实现(已过时但仍有参考价值)
public class Observable {private boolean changed = false;private Vector<Observer> observers;public synchronized void addObserver(Observer o) { /*...*/ }public void notifyObservers(Object arg) {// 同步通知逻辑...}
}// 现代实现(推荐)
public class PropertyChangeSupport {public void addPropertyChangeListener(PropertyChangeListener listener) { /*...*/ }public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {// 事件派发...}
}

响应式编程扩展(RxJava示例):

Observable<String> observable = Observable.create(emitter -> {emitter.onNext("Event 1");emitter.onNext("Event 2");emitter.onComplete();
});observable.subscribe(event -> System.out.println("Received: " + event),error -> System.err.println("Error: " + error),() -> System.out.println("Completed")
);

2. 策略模式(Strategy)——算法族的自由切换

Lambda表达式带来的革新

// 传统实现
public interface ValidationStrategy {boolean execute(String s);
}public class IsNumeric implements ValidationStrategy {@Overridepublic boolean execute(String s) {return s.matches("\\d+");}
}// Lambda实现
ValidationStrategy numericStrategy = s -> s.matches("\\d+");
ValidationStrategy lowerCaseStrategy = s -> s.matches("[a-z]+");// 上下文使用
public class Validator {private ValidationStrategy strategy;public Validator(ValidationStrategy v) { this.strategy = v; }public boolean validate(String s) { return strategy.execute(s); }
}

Java集合框架的典型应用

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Collections.sort(names, (a, b) -> b.compareTo(a));  // 策略注入

五、Java特有模式深度探讨

1. 空对象模式(Null Object)——防御式编程的优雅解决方案

完整实现示例

public interface Logger {void log(String message);
}public class ConsoleLogger implements Logger {@Overridepublic void log(String message) {System.out.println(message);}
}public class NullLogger implements Logger {@Overridepublic void log(String message) {// 静默处理}
}// 客户端使用
public class PaymentService {private Logger logger = new NullLogger();  // 默认安全public void setLogger(Logger logger) {this.logger = Objects.requireNonNullElse(logger, new NullLogger());}public void processPayment() {logger.log("Payment started");// 业务逻辑...}
}

2. 不可变对象模式(Immutable Object)——并发安全的终极形态

构建不可变类的五大铁律

  1. 所有字段final修饰
  2. 类声明为final
  3. 不暴露可变引用
  4. 不提供setter方法
  5. 构造器完全初始化

深度防御示例

public final class ImmutablePerson {private final String name;private final Date birthDate;  // Date本身可变public ImmutablePerson(String name, Date birthDate) {this.name = name;// 防御性拷贝this.birthDate = new Date(birthDate.getTime());}public Date getBirthDate() {// 返回拷贝对象return new Date(birthDate.getTime());}
}

六、模式应用黄金法则

1. 模式选择决策树

是否需要控制对象创建? → 创建型模式├─ 需要全局唯一实例 → 单例├─ 需要复杂构造过程 → 建造者└─ 需要灵活的产品族 → 抽象工厂是否需要重组对象结构? → 结构型模式├─ 接口不兼容 → 适配器├─ 需要透明扩展 → 装饰器└─ 控制对象访问 → 代理是否需要协调对象行为? → 行为型模式├─ 事件通知机制 → 观察者├─ 算法动态切换 → 策略└─ 流程标准化 → 模板方法

2. 模式反模式警示

  • 单例滥用:导致隐藏的依赖关系和测试困难
  • 过度装饰:产生过多小对象影响性能
  • 观察者泄漏:未及时取消注册导致内存泄漏
  • 策略膨胀:大量策略类增加维护成本

七、现代Java中的模式演进

1. Lambda表达式对传统模式的冲击

策略模式简化

// 传统方式
Arrays.sort(words, new Comparator<String>() {public int compare(String a, String b) {return Integer.compare(a.length(), b.length());}
});// Lambda简化
Arrays.sort(words, (a, b) -> Integer.compare(a.length(), b.length()));

2. 模块化带来的模式变化

服务加载器替代工厂模式

// META-INF/services/com.example.DatabaseConnection
ServiceLoader<DatabaseConnection> loader = ServiceLoader.load(DatabaseConnection.class);
DatabaseConnection conn = loader.findFirst().orElseThrow();

八、设计模式在Java生态中的典型应用

框架/库核心模式具体实现
Spring工厂模式、代理模式、模板方法BeanFactory、AOP代理、JdbcTemplate
Hibernate代理模式、工厂模式延迟加载代理、SessionFactory
JavaFX观察者模式、命令模式Property绑定、EventHandler
Netty责任链模式、Reactor模式ChannelPipeline、EventLoop

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 向量数据库,原生支持 Google Cloud Vertex AI 平台

作者&#xff1a;来自 Elastic Valerio Arvizzigno Elasticsearch 将作为第一个第三方原生语义对齐引擎&#xff0c;支持 Google Cloud 的 Vertex AI 平台和 Google 的 Gemini 模型。这使得联合用户能够基于企业数据构建完全可定制的生成式 AI 体验&#xff0c;并借助 Elastics…

408 计算机网络 知识点记忆(7)

前言 本文基于王道考研课程与湖科大计算机网络课程教学内容&#xff0c;系统梳理核心知识记忆点和框架&#xff0c;既为个人复习沉淀思考&#xff0c;亦希望能与同行者互助共进。&#xff08;PS&#xff1a;后续将持续迭代优化细节&#xff09; 往期内容 408 计算机网络 知识…

10-MySQL-性能优化思路

1、优化思路 当我们发现了一个慢SQL的问题的时候,需要做性能优化,一般我们是为了提高SQL查询更快,一个查询的流程由下图的各环节组成,每个环节都会消耗时间,要减少消耗时候需要从各个环节都分析一遍。 2 连接配置优化 第一个环节是客户端连接到服务端,这块可能会出现服务…

Docker:安装与部署 Nacos 的技术指南

1、简述 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个动态服务发现、配置管理和服务治理的综合解决方案,适用于微服务架构。 Nacos 主要功能: 服务发现与注册:支持 Dubbo、Spring Cloud 等主流微服务框架的服务发现与注册。动态配置管理:支持…

【非机动车检测】用YOLOv8实现非机动车及驾驶人佩戴安全帽检测

非机动车及驾驶人佩戴安全帽检测任务的意义主要包括以下几点&#xff1a; 保障行车安全&#xff1a;非机动车包括自行车、电动车等&#xff0c;佩戴安全帽能够有效保护骑车人头部&#xff0c;减少因交通事故造成的头部伤害风险&#xff0c;提高行车安全系数。 符合交通法规&am…

壹起航:15年深耕互联网营销,助力中国工厂出海获客

在全球化浪潮下&#xff0c;越来越多的中国工厂渴望拓展海外市场&#xff0c;但面临品牌建立、稳定询盘获取及营销成本降低等多重挑战。壹起航凭借15年的丰富经验&#xff0c;整合外贸建站、SEO优化及海外短视频营销&#xff0c;为中国工厂提供一站式出海解决方案。 一、外贸独…

Emacs 折腾日记(二十)——修改emacs的一些默认行为

上一篇我们完成了emacs输入法的配置以及将emacs配置成了使用vim的操作方式。但是emacs目前有些默认行为我不太喜欢&#xff0c;这节我们一起来修改它 备份设置 我们打开emacs的配置文件所在路径&#xff0c;发现有大量的~结尾的文件&#xff0c;这是emacs的备份文件。这里&am…

聊透多线程编程-线程基础-4.C# Thread 子线程执行完成后通知主线程执行特定动作

在多线程编程中&#xff0c;线程之间的同步和通信是一个常见的需求。例如&#xff0c;我们可能需要一个子线程完成某些任务后通知主线程&#xff0c;并由主线程执行特定的动作。本文将基于一个示例程序&#xff0c;详细讲解如何使用 AutoResetEvent 来实现这种场景。 示例代码…

【网络安全 | 项目开发】Web 安全响应头扫描器(提升网站安全性)

原创项目,未经许可,不得转载。 文章目录 项目简介工作流程示例输出技术栈项目代码使用说明项目简介 安全响应头是防止常见 Web 攻击(如点击劫持、跨站脚本攻击等)的有效防线,因此合理的配置这些头部信息对任何网站的安全至关重要。 Web 安全响应头扫描器(Security Head…

使用libcurl编写爬虫程序指南

用户想知道用Curl库编写的爬虫程序是什么样的。首先&#xff0c;我需要明确Curl本身是一个命令行工具和库&#xff0c;用于传输数据&#xff0c;支持多种协议。而用户提到的“Curl库”可能指的是libcurl&#xff0c;这是一个客户端URL传输库&#xff0c;可以用在C、C等编程语言…

使用pip3安装PyTorch与PyG,实现NVIDIA CUDA GPU加速

使用python3的pip3命令安装python依赖库。 # python3 -V Python 3.12.3 # # pip3 -V pip 25.0.1 from /root/.pyenv/versions/3.12.3/lib/python3.12/site-packages/pip (python 3.12)Usage: pip3 install [options] <package> ...pip3 install [options] -r <re…

五种常用的web加密算法

文章目录 五种常用Web加密算法实战及原理详解1. AES (高级加密标准)原理详解应用场景实战代码&#xff08;Node.js&#xff09; 2. RSA (非对称加密)原理详解应用场景实战代码&#xff08;Node.js&#xff09; 3. SHA-256 (安全哈希算法)原理详解应用场景实战代码&#xff08;浏…

深入解析 C++ 设计模式:原理、实现与应用

一、引言 在 C 编程的广袤领域中&#xff0c;设计模式犹如闪耀的灯塔&#xff0c;为开发者指引着构建高效、可维护软件系统的方向。设计模式并非神秘莫测的代码魔法&#xff0c;实际上&#xff0c;我们在日常编程中或许早已与之打过交道。简单来说&#xff0c;设计模式常常借助…

Python刷题笔记

Python刷题笔记 1、输出格式化 第一种格式化的输出&#xff1a; name "jack" age 17 salary 20031.8752 print("你的名字是&#xff1a;%s,今年 %d 岁,工资 %7.2f" % (name,age,salary) ) --------------------------------------- 你的名字是&#…

【Kubernetes】Kubernetes 如何进行日志管理?Fluentd / Loki / ELK 适用于什么场景?

由于 Kubernetes 运行在容器化的环境中&#xff0c;应用程序和系统日志通常分布在多个容器和节点上&#xff0c;传统的日志管理方法&#xff08;例如直接访问每个节点的日志文件&#xff09;在 Kubernetes 中不适用。 因此&#xff0c;Kubernetes 引入了集中式日志管理方案&am…

Ansible(8)——循环与条件任务

目录 一、循环迭代任务&#xff1a; 1、简单循环&#xff1a; 2、循环字典列表&#xff1a; 3、Ansible 2.5 之前的循环关键字&#xff1a; 4、在循环中使用 register 变量&#xff1a; 二、条件任务&#xff1a; 1、使用条件句的常见场景&#xff1a; 2、条件任务语法…

adb|scrcpy的安装和配置方法|手机投屏电脑|手机声音投电脑|adb连接模拟器或手机

adb|scrcpy的安装和配置方法手机投屏电脑|手机声音投电脑|adb连接模拟器或手机或电视 引言 在数字设备交织的现代生活中&#xff0c;adb&#xff08;Android Debug Bridge&#xff09;与 scrcpy 宛如隐匿的强大工具&#xff0c;极大地拓展了我们操控手机、模拟器乃至智能电视等…

vue3项目集成electron

一、环境准备 1. 确保已安装 Node.js (建议版本 16.x 或更高) 2. 创建或进入现有 Vue 项目目录 cd your-vue-project 二、添加 Electron 支持 在项目根目录执行: vue add electron-builder 执行后会在 `src` 目录下生成 `background.js` 主进程文件。 三、主进程配置 (ba…

循环神经网络 - 参数学习之随时间反向传播算法

本文中&#xff0c;我们以同步的序列到序列模式为例来介绍循环神经网络的参数学习。 循环神经网络中存在一个递归调用的函数 &#x1d453;(⋅)&#xff0c;因此其计算参数梯度的方式和前馈神经网络不太相同。在循环神经网络中主要有两种计算梯度的方式&#xff1a;随时间反向…

体验OceanBase的 并行导入功能

在数据库的日常使用中&#xff0c;会经常遇到以下场景&#xff1a; ‌数据复制‌&#xff1a;将一个或多个表中的数据复制到目标表中&#xff0c;可能是复制全部数据&#xff0c;也可能仅复制部分数据。数据合并&#xff1a;将数据从一个表转移到另一个表&#xff0c;或者将多…