【Java】常用设计模式及应用场景详解

设计模式分为三大类:创建型 (5种)、结构型 (7种)、行为型(11种),以下是 Java 开发中最核心、高频使用的模式及真实场景

一、创建型模式(Creational Patterns)

模式 核心目的 Java/框架中的应用场景
单例模式 确保类仅有一个实例,全局访问 1. Spring Bean 默认作用域 (singleton) 2. Runtime.getRuntime() 获取 JVM 运行时 3. 数据库连接池(如 HikariCP 的池管理器)
工厂模式 (简单工厂/工厂方法/抽象工厂) 封装对象创建逻辑,解耦调用者与实现 1. Calendar.getInstance() 创建日历对象 2. JDBC DriverManager 获取数据库连接 3. Spring BeanFactory 创建和管理 Bean
建造者模式 分步构建复杂对象,链式调用 1. StringBuilder.append() 构建字符串 2. Spring Security User.withDefaultPasswordEncoder() 3. Lombok @Builder 自动生成建造者
原型模式 通过克隆创建对象,避免重复初始化 1. Object.clone() 方法 2. JDK ArrayListclone() 实现 3. Spring Bean 的 prototype 作用域

二、结构型模式(Structural Patterns)

2.1 高频核心模式

模式 核心目的 Java/框架中的应用场景
代理模式 为对象提供代理,控制访问或增强功能 1. Spring AOP 动态代理(JDK 动态代理/CGLIB) 2. MyBatis Mapper 接口 的代理实现 3. RMI 远程代理 实现跨 JVM 调用
装饰器模式 动态为对象添加职责,透明扩展 1. Java IO 流BufferedInputStream 装饰 FileInputStream) 2. Spring Cache 装饰器 增强方法缓存 3. Servlet Filter 链 装饰 HTTP 请求处理
适配器模式 转换接口,使不兼容类协同工作 1. Arrays.asList() 将数组适配为 List 2. Spring MVC HandlerAdapter 适配不同 Controller 3. JPA 的 JpaVendorAdapter 适配不同数据库
外观模式 为子系统提供统一入口,简化调用 1. Spring JdbcTemplate 封装 JDBC 复杂操作 2. SLF4J 门面 统一日志框架(Logback/Log4j) 3. Tomcat RequestFacade 封装 ServletRequest

2.2 中等频率模式

模式 核心目的 Java/框架中的应用场景
组合模式 树形结构,统一处理单个对象和组合对象 1. Java Swing GUI 组件 (Container 包含 Component) 2. JSF UIComponent 树 3. 组织结构树(员工与部门统一接口)
桥接模式 分离抽象与实现,独立扩展 1. JDBC 驱动桥接 (Driver 桥接不同数据库协议) 2. Spring 的桥接模式 在 Bean 定义与实现间 3. AWT 的 Peer 架构(跨平台 GUI)
享元模式 共享细粒度对象,节省内存 1. String 字符串常量池 (如 "abc" 复用) 2. Integer.valueOf() 缓存 -128~127 对象 3. 数据库连接池 复用连接对象

三、行为型模式(Behavioral Patterns)

3.1 高频核心模式

模式 核心目的 Java/框架中的应用场景
策略模式 封装算法族,运行时动态切换 1. Spring Resource 策略 加载(classpath/file/url) 2. Collections.sort() 传入 Comparator 策略 3. 支付系统 支持微信/支付宝/银联多策略
观察者模式 发布-订阅,一对多依赖通知 1. Java EventListener (如 ServletContextListener) 2. Spring ApplicationEvent 事件驱动(如 ContextRefreshedEvent) 3. Guava EventBus 组件解耦
模板方法模式 定义算法骨架,子类实现细节 1. Spring JdbcTemplate 执行流程模板 2. HttpServletservice() 模板方法(doGet/doPost) 3. AbstractApplicationContext 的 refresh() 模板
责任链模式 链式传递请求,松散耦合 1. Servlet Filter 链 (认证→日志→鉴权) 2. Spring Security FilterChain 安全过滤 3. Netty ChannelPipeline 责任链处理 IO 事件
迭代器模式 顺序访问聚合对象元素 1. Java Iterator/Iterable 接口(ArrayList.iterator()) 2. MyBatis Cursor 游标迭代大数据 3. Guava FluentIterable 增强迭代
命令模式 封装请求为对象,支持撤销/队列 1. Runnable/Callable 封装任务 2. Spring JmsTemplate 发送消息命令 3. 撤销/重做功能(编辑器历史栈)
状态模式 对象行为随状态改变而改变 1. 线程 Thread.State 枚举(NEW/RUNNABLE/BLOCKED) 2. 订单状态机 (待支付→已支付→已发货) 3. Game 角色状态(正常/眩晕/冰冻)

3.2 中等频率模式

模式 核心目的 Java/框架中的应用场景
备忘录模式 保存对象状态,支持恢复 1. Serializable 序列化 保存对象状态 2. Git 版本控制 保存代码历史 3. 游戏存档/读档
中介者模式 封装对象交互,降低耦合 1. Java Concurrency Executor 协调线程 2. Spring MVC DispatcherServlet 协调 Controller/View 3. 消息队列中间件 解耦服务
访问者模式 分离操作与对象结构 1. Java AnnotationValueVisitor 注解处理 2. 编译器 AST 遍历 3. 报表导出(同一数据导出 CSV/PDF/Excel)
解释器模式 定义语法规则,解释执行 1. Java 正则表达式 Pattern 2. Spring SpEL 表达式#{...}) 3. SQL 解析器(如 Druid SQL Parser)

四、设计模式在主流框架中的体现

Spring Framework

java 复制代码
// 单例模式:Bean 默认作用域
@Component  // 默认 singleton
public class UserService { ... }

// 工厂模式:BeanFactory 创建 Bean
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
UserService service = ctx.getBean(UserService.class);

// 代理模式:AOP 动态代理
@Aspect
public class LogAspect {
    @Around("execution(* com.example.*.*(..))")
    public Object log(ProceedingJoinPoint pjp) { ... }
}

// 模板方法:JdbcTemplate
jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> new User(rs));

MyBatis

java 复制代码
// 代理模式:Mapper 接口代理
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectById(Long id);
}
// MyBatis 自动生成代理实现类

// 建造者模式:SqlSessionFactoryBuilder
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
    .build(inputStream);

JDK 核心库

java 复制代码
// 装饰器模式:IO 流
InputStream is = new BufferedInputStream(
    new FileInputStream("file.txt")
);

// 迭代器模式:集合遍历
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();

// 单例模式:Runtime
Runtime runtime = Runtime.getRuntime();
runtime.exec("ls -l");

五、选型决策指南

场景需求 推荐模式 避免场景
全局共享资源 单例模式 频繁创建销毁
对象创建复杂 建造者/工厂模式 在业务代码硬编码 new
需要动态扩展功能 装饰器/代理模式 继承层级过深
处理流程固定,步骤可变 模板方法模式 重复代码
多策略切换 策略模式 if-else 地狱
组件解耦/事件驱动 观察者/中介者模式 直接依赖调用
树形结构管理 组合模式 递归处理复杂
跨接口兼容 适配器模式 修改原有代码

黄金法则:优先使用创建型模式解耦对象创建,用结构型模式优化代码组织,用行为型模式提升扩展性。在框架开发中多使用代理/装饰器,业务开发中多使用策略/模板方法。

相关推荐
一条可有可无的咸鱼2 小时前
企业招聘信息,企业资讯进行公示
java·vue.js·spring boot·uni-app
Sammyyyyy2 小时前
DeepSeek v3.2 正式发布,对标 GPT-5
开发语言·人工智能·gpt·算法·servbay
Luna-player2 小时前
在前端中,<a> 标签的 href=“javascript:;“ 这个是什么意思
开发语言·前端·javascript
小草cys2 小时前
项目7-七彩天气app任务7.4.2“关于”弹窗
开发语言·前端·javascript
程序猿DD2 小时前
JUnit 5 中的 @ClassTemplate 实战指南
java·后端
小鸡吃米…2 小时前
Python PyQt6教程三-菜单与工具栏
开发语言·python
爱吃山竹的大肚肚3 小时前
EasyPOI 大数据导出
java·linux·windows
aini_lovee3 小时前
寻找 MAC 协议的 MATLAB 仿真
开发语言·macos·matlab