主题
面试题蒸馏卡:常用设计模式及应用场景
问题:开发中用过哪些设计模式?
一句话机制
设计模式是对"变化点"的封装:把"会变的部分"从"不变的逻辑"里抽出来,用组合/继承/接口留出扩展点。回答不要背名字,要讲"在哪用、为什么用这个"。
实际用到的模式(场景 → 模式)
| 模式 | 实际用到的地方 |
|---|---|
| 单例 | Spring Bean 默认单例、连接池、配置中心、Redis 客户端 |
| 工厂 | BeanFactory、SqlSessionFactory、各种 XxxFactory |
| 建造者 Builder | StringBuilder、SqlSessionFactoryBuilder、OkHttp Request.Builder、Lombok @Builder |
| 代理 Proxy | Spring AOP、事务、@Transactional、MyBatis Mapper 接口、RPC 客户端桩 |
| 模板方法 | JdbcTemplate/RedisTemplate、Servlet doGet/doPost、*Template 系列 |
| 策略 Strategy | ThreadPoolExecutor 拒绝策略、支付方式路由、Comparator |
| 观察者 Observer | Spring ApplicationEvent、消息监听、Guava EventBus |
| 责任链 | Servlet Filter、HandlerInterceptor、Netty Pipeline、OkHttp Interceptor |
| 适配器 Adapter | Spring MVC HandlerAdapter、Slf4j 门面、事务 PlatformTransactionManager |
| 装饰器 Decorator | Java IO(BufferedInputStream)、Collections.synchronizedList |
| 门面 Facade | JdbcUtils、RestTemplate 封装、统一对外 API |
追问链
- 单例在 Spring 里线程安全吗? 容器保证单例 bean 只创建一次;但 bean 内部若有可变状态,并发安全要自己保证(无状态组件通常安全)。
- 代理和装饰器结构相似,区别在哪? 代理控制访问(AOP 加事务/鉴权,原对象对调用方透明);装饰器增强功能(叠加职责,如 IO 流套 Buffer)。
- 策略模式和工厂模式怎么配合? 工厂负责"创建哪个策略对象",策略负责"执行算法"——常见
StrategyFactory。 - 模板方法 vs 回调? 都是"固定流程 + 可变步骤";模板方法用继承(子类重写钩子),回调用函数对象(更轻量,如
RedisTemplate.execute)。 - 你项目里哪里用了责任链? Spring
HandlerInterceptor、ServletFilter、Gateway的 GlobalFilter 都是责任链。
常见误解
- ❌ "设计模式就是 GOF 23 种" —— 还有 J2EE/并发/架构模式,且不要为了用而用(过度设计比不用更糟)。
- ❌ "单例 = 全局变量" —— 并发下要注意 double-checked locking 的
volatile可见性。 - ❌ "工厂模式很复杂" —— 简单工厂/工厂方法/抽象工厂按场景选,多数业务用简单工厂或 Spring 注入即可。