设计模式分为三大类:创建型(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
// 单例模式:Bean 默认作用域@Component// 默认 singletonpublicclassUserService{...}// 工厂模式:BeanFactory 创建 BeanApplicationContextctx=newAnnotationConfigApplicationContext(AppConfig.class);UserServiceservice=ctx.getBean(UserService.class);// 代理模式:AOP 动态代理@AspectpublicclassLogAspect{@Around("execution(* com.example.*.*(..))")publicObjectlog(ProceedingJoinPointpjp){...}}// 模板方法:JdbcTemplatejdbcTemplate.query("SELECT * FROM users",(rs,rowNum)->newUser(rs));MyBatis
// 代理模式:Mapper 接口代理publicinterfaceUserMapper{@Select("SELECT * FROM users WHERE id = #{id}")UserselectById(Longid);}// MyBatis 自动生成代理实现类// 建造者模式:SqlSessionFactoryBuilderSqlSessionFactoryfactory=newSqlSessionFactoryBuilder().build(inputStream);JDK 核心库
// 装饰器模式:IO 流InputStreamis=newBufferedInputStream(newFileInputStream("file.txt"));// 迭代器模式:集合遍历List<String>list=newArrayList<>();Iterator<String>it=list.iterator();// 单例模式:RuntimeRuntimeruntime=Runtime.getRuntime();runtime.exec("ls -l");五、选型决策指南
| 场景需求 | 推荐模式 | 避免场景 |
|---|---|---|
| 全局共享资源 | 单例模式 | 频繁创建销毁 |
| 对象创建复杂 | 建造者/工厂模式 | 在业务代码硬编码 new |
| 需要动态扩展功能 | 装饰器/代理模式 | 继承层级过深 |
| 处理流程固定,步骤可变 | 模板方法模式 | 重复代码 |
| 多策略切换 | 策略模式 | if-else 地狱 |
| 组件解耦/事件驱动 | 观察者/中介者模式 | 直接依赖调用 |
| 树形结构管理 | 组合模式 | 递归处理复杂 |
| 跨接口兼容 | 适配器模式 | 修改原有代码 |
黄金法则:优先使用创建型模式解耦对象创建,用结构型模式优化代码组织,用行为型模式提升扩展性。在框架开发中多使用代理/装饰器,业务开发中多使用策略/模板方法。