Java中用到的设计模式

一、单例模式(Singleton Pattern)

应用场景:全局唯一实例管理

源码案例:

java.lang.Runtime#getRuntime():整个 JVM 生命周期中唯一运行时实例

java.util.Collections#EMPTY_LIST:空集合对象的全局访问点

Spring 框架的 Bean 默认以单例模式管理(通过 @Scope("singleton") 实现)

实现特点:双重检查锁(DCL)或静态内部类保证线程安全。

二、工厂方法模式(Factory Method Pattern)

应用场景:对象创建逻辑解耦

源码案例:

java.util.Calendar#getInstance():根据时区动态创建日历对象

java.sql.DriverManager#getConnection():根据驱动类型创建数据库连接

JDBC 的 Driver 接口实现类(如 com.mysql.jdbc.Driver)

扩展:Spring 的 BeanFactory 和 ApplicationContext 是工厂模式的扩展实现。

## 三、观察者模式(Observer Pattern)

应用场景:事件驱动与状态通知

源码案例:

java.util.Observable 与 java.util.Observer 接口:实现对象状态变化的监听

Spring 框架的事件机制(如 ApplicationEventPublisher 发布事件,@EventListener 监听)

Java Bean 属性变更监听(PropertyChangeListener)

四、适配器模式(Adapter Pattern)

应用场景:接口兼容性转换

源码案例:

java.util.Arrays#asList():将数组适配为 List 接口

Java IO 中的 InputStreamReader(适配字节流到字符流)

Spring MVC 的 HandlerAdapter:统一处理不同类型的控制器(如 Servlet、注解控制器)

五、装饰器模式(Decorator Pattern)

应用场景:动态扩展对象功能

源码案例:

Java IO 流体系:如 BufferedInputStream 包装 FileInputStream 添加缓冲功能

java.util.Collections#unmodifiableList():生成不可修改的集合装饰器

Servlet API 的 HttpServletRequestWrapper:增强请求对象功能

六、策略模式(Strategy Pattern)

应用场景:算法动态切换

源码案例:

java.util.Comparator 接口:集合排序时通过不同 Comparator 实现策略选择

Spring 事务管理:支持编程式与声明式事务策略(PlatformTransactionManager)

Java 线程池的拒绝策略(RejectedExecutionHandler)

七、迭代器模式(Iterator Pattern)

应用场景:集合遍历解耦

源码案例:

java.util.Iterator 接口:所有集合类(如 ArrayList、HashSet)均通过迭代器遍历元素

Java 8 的 Spliterator:并行遍历的扩展实现

八、模板方法模式(Template Method Pattern)

应用场景:算法骨架固定,步骤可变

源码案例:

java.util.AbstractList:定义 addAll() 等通用方法,子类实现 get()、size() 等抽象方法

Spring 的 JdbcTemplate:封装数据库操作流程(连接获取、异常处理等),用户仅需编写 SQL

九、代理模式(Proxy Pattern)

应用场景:对象访问控制与功能增强

源码案例:

Java 动态代理(java.lang.reflect.Proxy):Spring AOP 基于此实现切面编程

RMI(远程方法调用)的 Stub 类:代理远程对象调用

MyBatis 的 MapperProxy:动态生成数据库操作接口的实现类

十、建造者模式(Builder Pattern)

应用场景:复杂对象分步构建

源码案例:

java.lang.StringBuilder 和 java.lang.StringBuffer:分步构建字符串

Lombok 的 @Builder 注解:自动生成建造者类

Spring 的 BeanDefinitionBuilder:构建 Bean 定义对象

相关推荐
程序喵大人14 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng15 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
Jelena1577958579215 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
wdfk_prog16 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕16 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫16 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通17 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
葬送的代码人生18 小时前
别再让 AI 瞎写代码了!Vibe Coding 三步法教你写出靠谱代码
前端·设计模式·架构
AC赳赳老秦18 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
AI多Agent协作实战派18 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug