设计模式分为三大类:创建型 (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 ArrayList 的 clone() 实现 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. HttpServlet 的 service() 模板方法(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 地狱 |
| 组件解耦/事件驱动 | 观察者/中介者模式 | 直接依赖调用 |
| 树形结构管理 | 组合模式 | 递归处理复杂 |
| 跨接口兼容 | 适配器模式 | 修改原有代码 |
黄金法则:优先使用创建型模式解耦对象创建,用结构型模式优化代码组织,用行为型模式提升扩展性。在框架开发中多使用代理/装饰器,业务开发中多使用策略/模板方法。