设计模式常见面试题
详解 设计模式。面试重场景 + 优缺点,少背 UML。
分类
| 类型 | 模式 |
|---|---|
| 创建型 | 单例、工厂、抽象工厂、建造者、原型 |
| 结构型 | 代理、装饰、适配器、桥接、组合、外观、享元 |
| 行为型 | 策略、模板方法、观察者、责任链、迭代器、命令、状态 |
创建型
| 模式 | 一句话 | 场景 |
|---|---|---|
| 单例 | 全局唯一实例 | 配置、连接池 |
| 工厂方法 | 子类决定创建哪个产品 | Logger、Payment 多实现 |
| 抽象工厂 | 创建产品族 | UI 主题套件 |
| 建造者 | 分步构建复杂对象 | StringBuilder、Lombok @Builder |
| 原型 | clone 复制对象 | 拷贝成本高时用原型 |
结构型(高频)
| 模式 | 一句话 | 场景 |
|---|---|---|
| 代理 | 控制访问、增强 | Spring AOP、MyBatis Mapper、RPC stub |
| 装饰 | 动态叠加职责 | InputStream 包装链 |
| 适配器 | 接口转换 | 老 API 适配新接口 |
| 外观 | 简化子系统入口 | Facade Service 聚合多 DAO |
代理 vs 装饰:代理控制访问、常管理生命周期;装饰增强功能、可多层叠加。
行为型(高频)
| 模式 | 一句话 | 场景 |
|---|---|---|
| 策略 | 算法可替换 | 促销规则、支付方式 |
| 模板方法 | 骨架固定、步骤可变 | AbstractList、JdbcTemplate |
| 观察者 | 发布-订阅 | Spring Event、MQ |
| 责任链 | 请求沿链传递 | Filter 链、Interceptor、审批流 |
| 状态 | 行为随状态变 | 订单状态机 |
与 Spring 对应
| Spring | 模式 |
|---|---|
| Bean 默认 singleton | 单例 |
| FactoryBean | 工厂 |
| AOP | 代理 |
| ApplicationListener | 观察者 |
| HandlerInterceptor 链 | 责任链 |
| Template 类(RestTemplate) | 模板方法 |
常见面试题
Q:单例几种写法?哪种最好?
A:饿汉、DCL+volatile、静态内部类、枚举(防反射/序列化)。见 单例模式。
Q:JDK 动态代理和 CGLIB?
A:JDK 基于接口;CGLIB 子类继承;Spring 有接口用 JDK,否则 CGLIB。
Q:策略模式和 if-else?
A:策略用 Map+接口消除分支,符合开闭原则,易扩展新策略。
Q:装饰和代理区别?
A:意图不同:装饰为扩展功能;代理为控制访问、延迟加载、权限等。