设计模式分为三大类:创建型(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 // 默认 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
// 代理模式:mapper 接口代理
public interface usermapper {
@select("select * from users where id = #{id}")
user selectbyid(long id);
}
// mybatis 自动生成代理实现类
// 建造者模式:sqlsessionfactorybuilder
sqlsessionfactory factory = new sqlsessionfactorybuilder()
.build(inputstream);
jdk 核心库
// 装饰器模式: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 地狱 |
| 组件解耦/事件驱动 | 观察者/中介者模式 | 直接依赖调用 |
| 树形结构管理 | 组合模式 | 递归处理复杂 |
| 跨接口兼容 | 适配器模式 | 修改原有代码 |
黄金法则:优先使用创建型模式解耦对象创建,用结构型模式优化代码组织,用行为型模式提升扩展性。在框架开发中多使用代理/装饰器,业务开发中多使用策略/模板方法。
到此这篇关于java常用设计模式及应用场景的文章就介绍到这了,更多相关java设计模式及应用场景内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论