设计模式是软件设计中常见问题的典型解决方案,可以理解为编程界的“武功秘籍”。GoF(四人组)提出的23种设计模式,按目的可分为三大类:
- 创建型模式(5种) :解决“对象怎么创建”的问题,将对象的创建与使用分离。
- 结构型模式(7种) :解决“类或对象如何组成更大结构”的问题。
- 行为型模式(11种) :解决“对象之间如何交互、职责如何分配”的问题。
系统架构师学习平台(点击这里进入)
一、创建型模式(5种)
1. 单例模式(Singleton)
通俗理解:一个类全局只有一个实例,像餐厅里只有一个消毒柜,所有人共用。
Spring Boot应用:Spring容器中的Bean默认就是单例的,整个应用上下文共享同一个实例。
@Service // 默认单例,全局只有一个实例
public class UserService {
public void doSomething() { ... }
}
2. 工厂模式(Factory Method)
通俗理解:把对象的创建交给“工厂”统一管理,像奶茶店根据订单生产不同口味的饮品,你不用管原料怎么来。
Spring Boot应用:BeanFactory和ApplicationContext就是典型的工厂,负责创建和管理Bean。
@Autowired
private ApplicationContext context;
public void test() {
// 工厂根据类型创建Bean
UserService service = context.getBean(UserService.class);
}
3. 抽象工厂模式(Abstract Factory)
通俗理解:工厂的工厂——当你要生产“整套产品”(比如一套北欧风家具:沙发+桌子+椅子),用一个工厂族来统一生产。
Spring Boot应用:Spring的@Configuration类可以看作抽象工厂,通过@Bean方法生产一系列相关对象。
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() { ... }
@Bean
public JdbcTemplate jdbcTemplate(DataSource ds) {
return new JdbcTemplate(ds);
}
}
4. 建造者模式(Builder)
通俗理解:像组装电脑——你可以一步步选择CPU、内存、硬盘,最后得到一台定制好的电脑,而不是一次性把所有参数塞进构造函数。
Spring Boot应用:RestTemplateBuilder、SecurityBuilder等,通过链式调用一步步构建复杂对象。
RestTemplate restTemplate = new RestTemplateBuilder()
.setConnectTimeout(Duration.ofSeconds(5))
.setReadTimeout(Duration.ofSeconds(10))
.build();
5. 原型模式(Prototype)
通俗理解:像复印机——有了一个原型文档,直接复印出副本,不用重新写一遍。
Spring Boot应用:将Bean的作用域设为prototype,每次获取都创建一个新实例。
@Scope("prototype") // 每次获取都创建新实例
@Component
public class PrototypeBean { ... }
二、结构型模式(7种)
6. 适配器模式(Adapter)
通俗理解:像手机转接头,把USB-C转成Lightning,让不兼容的接口能一起工作。
Spring Boot应用:HandlerAdapter将不同类型的Controller(@Controller、HttpRequestHandler等)适配成统一的处理接口。
// Spring MVC中,不同的Controller被适配成统一的处理方式
public class RequestMappingHandlerAdapter implements HandlerAdapter {
// 将@Controller方法适配成标准处理器
}
7. 代理模式(Proxy)
通俗理解:像明星的经纪人——你要找明星演出,得先经过经纪人,经纪人可以在中间加各种“增强”操作(签合同、收钱)。
Spring Boot应用:AOP(面向切面编程)就是通过代理模式实现的,在方法执行前后增强行为。
@Aspect
@Component
public class LogAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object log(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("方法执行前记录日志…");
Object result = pjp.proceed(); // 调用原方法
System.out.println("方法执行后记录日志…");
return result;
}
}
8. 装饰器模式(Decorator)
通俗理解:像给蛋糕加料——先有一个基础蛋糕,然后一层层加上奶油、水果、巧克力,每加一层都是“装饰”,但最终还是个蛋糕。
Spring Boot应用:Spring的HttpServletRequestWrapper可以对请求进行装饰增强;Spring Cloud的Feign客户端也可以通过装饰添加熔断、重试等功能。
9. 外观模式(Facade)
通俗理解:像餐厅的“服务员”——你不需要知道后厨怎么运作,只需要告诉服务员要点什么菜,他帮你搞定一切。
Spring Boot应用:JdbcTemplate就是外观模式,它封装了获取连接、处理异常、释放资源等复杂操作,开发者只需写SQL。
// 开发者只需要关心SQL,其他复杂操作都被JdbcTemplate封装了
jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) ->
new User(rs.getString("name"))
);
10. 桥接模式(Bridge)
通俗理解:像遥控器和电视——遥控器(抽象)和电视(实现)可以独立变化,换遥控器不影响电视,换电视也不影响遥控器。
Spring Boot应用:Spring的PlatformTransactionManager接口有多个实现(DataSourceTransactionManager、JpaTransactionManager等),将事务管理与具体数据源实现解耦。
11. 组合模式(Composite)
通俗理解:像文件夹和文件——文件夹里可以放文件,也可以放子文件夹,你可以把整个目录结构当作一个整体来操作。
Spring Boot应用:Spring的CompositeCacheManager可以组合多个缓存管理器,对外表现为一个统一的缓存管理接口。
12. 享元模式(Flyweight)
通俗理解:像图书馆的书——很多人借同一本书,但书只有一本,大家共享,不需要每人买一本。
Spring Boot应用:Spring容器中的单例Bean本质上就是享元模式——多个地方注入同一个Bean,共享同一个实例,节省内存。
三、行为型模式(11种)
13. 模板方法模式(Template Method)
通俗理解:像做菜的固定流程——都是“热锅→倒油→炒菜→出锅”,但具体炒什么菜由你决定。
Spring Boot应用:JdbcTemplate定义了数据库操作的固定流程(获取连接、执行SQL、处理结果、释放资源),开发者只需实现具体的SQL和结果映射。
// JdbcTemplate定义了模板流程,开发者只需提供SQL和映射逻辑
jdbcTemplate.query("SELECT * FROM emp", (rs, rowNum) ->
new Employee(rs.getInt("id"), rs.getString("name"))
);
14. 策略模式(Strategy)
通俗理解:像出行方式——去同一个地方,可以坐公交、打车、骑自行车,算法不同但结果一样,你可以随时切换。
Spring Boot应用:通过Map注入或@Qualifier实现策略的动态选择。
// 定义策略接口
public interface PaymentStrategy {
void pay(int amount);
}
// 多个策略实现
@Component("alipay")
public class AlipayStrategy implements PaymentStrategy { ... }
@Component("wechat")
public class WechatStrategy implements PaymentStrategy { ... }
// 使用时动态选择
@Autowired
private Map<String, PaymentStrategy> strategies;
public void pay(String type, int amount) {
strategies.get(type).pay(amount);
}
15. 观察者模式(Observer)
通俗理解:像微信群通知——群主发一条消息,所有群成员自动收到。
Spring Boot应用:Spring的事件监听机制就是观察者模式。
// 定义事件
public class OrderEvent extends ApplicationEvent {
public OrderEvent(Object source) { super(source); }
}
// 监听事件
@Component
public class OrderListener implements ApplicationListener<OrderEvent> {
@Override
public void onApplicationEvent(OrderEvent event) {
System.out.println("收到订单事件,发送通知…");
}
}
// 发布事件
applicationContext.publishEvent(new OrderEvent("订单创建"));
16. 责任链模式(Chain of Responsibility)
通俗理解:像公司审批流程——请假1天组长批,3天经理批,7天老板批,请求沿着链条传递,直到有人处理。
Spring Boot应用:Spring Security的过滤器链就是责任链模式;也可以用来处理订单流程。
// 定义处理器接口
public interface OrderHandler {
void setNext(OrderHandler next);
void handle(Order order);
}
// 多个处理器组成链:校验→扣库存→生成订单→发送通知
17. 命令模式(Command)
通俗理解:像餐厅的点菜单——顾客点菜写在单子上,厨师按单子做菜,下单的人(顾客)和执行的人(厨师)互不干扰。
Spring Boot应用:Spring的TaskExecutor将任务提交与执行解耦;Jdbc的BatchUpdate也是命令模式的应用。
18. 状态模式(State)
通俗理解:像水的变化——0度以下是冰,0-100度是水,100度以上是水蒸气,同一个对象在不同状态下行为不同。
Spring Boot应用:订单状态管理(待支付→已支付→已发货→已完成),每个状态对应不同的行为逻辑。
19. 中介者模式(Mediator)
通俗理解:像机场塔台——飞机之间不直接沟通,都通过塔台协调,避免混乱。
Spring Boot应用:Spring MVC的DispatcherServlet就是中介者,它接收所有请求,分发给对应的Controller处理。
20. 迭代器模式(Iterator)
通俗理解:像电视遥控器的“下一集”按钮——你不用关心电视剧存在哪里、怎么存的,按一下就能拿到下一个。
Spring Boot应用:Java集合框架的Iterator就是标准实现;Spring Data的Pageable和Slice也提供了分页迭代的能力。
21. 访问者模式(Visitor)
通俗理解:像收银台——超市里商品种类很多(书、食品、电器),但收银员(访问者)可以统一处理每种商品的结算,新增商品类型时不需要改收银逻辑。
Spring Boot应用:较少直接使用,但在AST语法树解析、文件遍历等场景中有应用。
22. 备忘录模式(Memento)
通俗理解:像游戏存档——打Boss前存个档,打输了可以读档重来。
Spring Boot应用:Spring Web Flow中的状态保存;@SessionAttributes也可以看作一种备忘录。
23. 解释器模式(Interpreter)
通俗理解:像翻译官——把一种语言(表达式)翻译成另一种语言(可执行的指令)。
Spring Boot应用:Spring的SpEL(Spring Expression Language)表达式解析就是解释器模式的应用。
// SpEL解析表达式
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello ' + 'World'");
String message = (String) exp.getValue(); // "Hello World"
总结
| 创建型 | 单例 | 全局唯一实例 | @Service、@Controller默认单例 |
| 创建型 | 工厂 | 创建对象统一管理 | BeanFactory、ApplicationContext |
| 创建型 | 抽象工厂 | 生产整套产品族 | @Configuration + @Bean |
| 创建型 | 建造者 | 一步步构建复杂对象 | RestTemplateBuilder |
| 创建型 | 原型 | 复制原型创建新对象 | @Scope("prototype") |
| 结构型 | 适配器 | 转换接口让不兼容的能合作 | HandlerAdapter |
| 结构型 | 代理 | 通过中间层增强/控制访问 | AOP切面 |
| 结构型 | 装饰器 | 动态添加新功能 | HttpServletRequestWrapper |
| 结构型 | 外观 | 封装复杂子系统,提供简单接口 | JdbcTemplate |
| 结构型 | 桥接 | 抽象与实现独立变化 | PlatformTransactionManager |
| 结构型 | 组合 | 树形结构统一处理 | CompositeCacheManager |
| 结构型 | 享元 | 共享对象节省资源 | 单例Bean |
| 行为型 | 模板方法 | 定义骨架,具体步骤子类实现 | JdbcTemplate |
| 行为型 | 策略 | 算法可互换 | Map注入策略类 |
| 行为型 | 观察者 | 状态变化自动通知 | Spring事件机制 |
| 行为型 | 责任链 | 请求沿链传递直到处理 | Spring Security过滤器链 |
| 行为型 | 命令 | 请求与执行解耦 | TaskExecutor |
| 行为型 | 状态 | 不同状态不同行为 | 订单状态机 |
| 行为型 | 中介者 | 对象间通过中介协调 | DispatcherServlet |
| 行为型 | 迭代器 | 顺序访问集合元素 | Iterator、Spring Data分页 |
| 行为型 | 访问者 | 在不改变元素前提下定义新操作 | 较少直接用 |
| 行为型 | 备忘录 | 保存/恢复对象状态 | @SessionAttributes |
| 行为型 | 解释器 | 解析表达式/语言 | SpEL表达式 |
提示:如果想深入学习,可以参考一些开源项目,如Gitee上的SpringBoot-DesignMode项目,它用Spring Boot实现了全部23种设计模式的Demo案例。

![[项目] --- 基于 Spring Boot + Redis的多设计模式抽奖系统-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261031220757-6ae666bdaa3f5-220x150.png)


