news 2026/6/10 12:51:45

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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

// 单例模式: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 地狱
组件解耦/事件驱动观察者/中介者模式直接依赖调用
树形结构管理组合模式递归处理复杂
跨接口兼容适配器模式修改原有代码

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:41:40

7、基于GEE 平台的 VIIRS 夜间灯光监测工具

VIIRS 夜间灯光监测工具 这是一个基于 Google Earth Engine (GEE) 的交互式应用程序&#xff0c;用于监测、分析和下载 NOAA VIIRS 月度夜间灯光数据。该工具集成了动态可视化、时序分析、GIF 动图生成以及批量数据导出到 Google Drive 的功能。 ✨ 主要功能自定义时间范围: 支…

作者头像 李华
网站建设 2026/6/9 14:46:52

Java 中 NIO 和IO 的区别

在Java 中&#xff0c;IO&#xff08;input/output&#xff09;和 NIO(new Input/output) 是两种不同的输入输出处理机制。它们各自有不同的设计理念和使用场景&#xff0c;理解这两者的区别对于优化性能、提高应用的响应速度非常重要。 一、IO&#xff08;传统输入输出&#…

作者头像 李华
网站建设 2026/6/10 14:10:41

gcc的-O优化等级和编译后程序占用空间的关系

文章目录gcc的-O优化等级和编译后程序占用空间的关系概述笔记-O0-O1-O2-O3-Os-Ofast-Og-Oz不同优化等级下编译后的size比较不指定-O开关-O-O0-O1-O2-O3-Os-Ofast-Og-Oz整理备注ENDgcc的-O优化等级和编译后程序占用空间的关系 概述 在调试固件&#xff0c;想看看可以选哪个优化…

作者头像 李华
网站建设 2026/6/10 14:08:58

如何将LobeChat与自有Token系统集成?技术实现路径揭秘

如何将LobeChat与自有Token系统集成&#xff1f;技术实现路径揭秘 在企业加速拥抱大语言模型的今天&#xff0c;一个普遍而棘手的问题浮出水面&#xff1a;如何在享受AI强大能力的同时&#xff0c;不牺牲系统的安全性与可控性&#xff1f;许多团队尝试部署像 ChatGPT 这样的闭源…

作者头像 李华
网站建设 2026/6/10 2:33:44

梅州揭阳汕头潮州文旅景区商业街区美陈氛围设计公司【TOP3名单】

在文旅融合不断深化的背景下&#xff0c;梅州、揭阳、汕头、潮州作为粤东文化的核心承载地&#xff0c;正以其独特的历史脉络、民俗风情与自然景观&#xff0c;吸引着越来越多游客的目光。景区与商业街区的美陈氛围设计&#xff0c;不仅是空间的艺术化塑造&#xff0c;更是地方…

作者头像 李华
网站建设 2026/6/9 21:04:36

14、Windows与UNIX脚本编程及监控工具全解析

Windows与UNIX脚本编程及监控工具全解析 1. 资源状态检查脚本分析 在进行系统监控时,我们常常需要检查资源的状态。以下是一段用于检查资源是否处于在线状态的Perl脚本: #are any resources in any state other than online? for ($i=0;$i<$max; ++$i){if($collectio…

作者头像 李华