本文目录导读:

Java经典设计模式通常分为创建型、结构型和行为型三大类,共23种(GoF模式),在实际的Java开发(尤其是Spring、JDK、Java EE)中,以下几种最常见且最具代表性。
创建型模式(关注对象创建机制)
单例模式(Singleton)
- 场景:保证一个类仅有一个实例,提供全局访问点。
- Java经典实现:
Runtime.getRuntime()、Spring默认的Bean作用域(singleton)。 - 核心代码:私有构造器 + 静态方法返回唯一实例(推荐使用枚举或双重校验锁)。
工厂方法模式 & 抽象工厂模式
- 场景:将对象创建逻辑封装,实现“开闭原则”。
- Java经典案例:
java.util.Collection接口的iterator()方法(工厂方法)。- Spring的
BeanFactory(工厂模式)。 - 数据库连接池(如HikariCP创建
Connection对象)。
建造者模式(Builder)
- 场景:构建复杂对象,分离构造与表示。
- Java经典案例:
StringBuilder/StringBuffer。- Lombok的
@Builder注解。 - 不可变对象(如
java.util.ImmutableList)。
原型模式(Prototype)
- 场景:通过克隆创建对象,避免重复初始化。
- Java经典案例:
Object.clone()(需实现Cloneable接口),例如ArrayList的浅拷贝。
结构型模式(关注类/对象的组合)
适配器模式(Adapter)
- 场景:使不兼容的接口协同工作。
- Java经典案例:
java.io.InputStreamReader(将InputStream适配为Reader)。- Spring AOP的
AdvisorAdapter。 Arrays.asList()(将数组转换为List适配器)。
代理模式(Proxy)
- 场景:控制对对象的访问,例如延迟加载、权限控制。
- Java经典案例:
- 静态代理:
Thread与Runnable。 - 动态代理:JDK动态代理(
java.lang.reflect.Proxy)和CGLIB(Spring AOP默认)。
- 静态代理:
装饰器模式(Decorator)
- 场景:动态添加行为,比继承更灵活。
- Java经典案例:
java.io.BufferedInputStream装饰FileInputStream。javax.servlet.http.HttpServletRequestWrapper。
外观模式(Facade)
- 场景:为复杂子系统提供统一入口。
- Java经典案例:
java.net.URL(封装网络通信细节)。
行为型模式(关注对象间通信与职责分配)
观察者模式(Observer)
- 场景:一对多依赖,状态变化自动通知。
- Java经典案例:
java.util.Observer/Observable(JDK 9之前)。- Spring事件机制:
ApplicationListener+ApplicationEvent。 - 消息队列(如Kafka发布/订阅)。
策略模式(Strategy)
- 场景:算法可互换,封装变化点。
- Java经典案例:
java.util.Comparator接口(排序策略不同)。- Spring的
Resource接口(文件/HTTP等访问策略)。 - 电商折扣计算(普通价、会员价、促销价)。
模板方法模式(Template Method)
- 场景:固定骨架+子类实现具体步骤。
- Java经典案例:
AbstractList的addAll()(内部调用子类实现的add())。- Spring的
JdbcTemplate(执行SQL固定流程,回调处理结果)。 - Servlet的
doGet()/doPost()。
责任链模式(Chain of Responsibility)
- 场景:请求沿链传递直到被处理。
- Java经典案例:
javax.servlet.Filter(filter链)。- Spring Security的
SecurityFilterChain。 - Java日志框架(
Logger按级别向上传播)。
迭代器模式(Iterator)
- 场景:统一集合遍历方式。
- Java经典案例:
java.util.Iterator(所有Collection的实现)。
Java开发中额外高频使用的模式
| 模式 | 典型应用场景 | 代表案例 |
|---|---|---|
| 享元模式 | 连接池、字符串常量池、线程池 | String.intern()、Integer.valueOf()缓存 |
| 命令模式 | 撤回/重做、线程池任务 | Runnable(将“操作”封装为对象) |
| 状态模式 | 有限状态机(订单状态、网络状态) | 电商订单(待支付/已支付/已发货) |
| 解释器模式 | 正则表达式、SPEL表达式 | java.util.regex.Pattern |
如何快速判断一个模式?
- “工厂”:凡是名称带有
Factory、Builder、Provider的,大概率是创建型模式。 - “包装”:
InputStream、Buffered、Wrapper,常是装饰器或适配器。 - “回调”:
Listener、Handler、Callback,常是观察者或模板方法。 - “可插拔”:
Strategy、Policy,常是策略模式。
在Java面试或实际开发中,单例、工厂、代理、观察者、策略、模板方法是最常被问及、也最实用的六个模式,理解它们与Spring、JDK框架的结合点,会让你对Java设计有更深刻的认识。