Java设计模式面试题详解
🤟致敬读者
- 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉
📘博主相关
- 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息
文章目录
- Java设计模式面试题详解
- 一、设计模式基础概念
- 1. 设计模式的三大分类
- 2. SOLID原则
- 二、高频创建型模式面试题
- 1. 单例模式(Singleton)
- 2. 工厂方法模式(Factory Method)
- 3. 建造者模式(Builder)
- 三、高频结构型模式面试题
- 1. 代理模式(Proxy)
- 2. 适配器模式(Adapter)
- 3. 装饰器模式(Decorator)
- 四、高频行为型模式面试题
- 1. 观察者模式(Observer)
- 2. 策略模式(Strategy)
- 3. 责任链模式(Chain of Responsibility)
- 五、综合面试题
- 1. Spring框架中的设计模式应用
- 2. 如何选择设计模式?
- 3. 设计模式六大原则实践
- 六、高频面试题汇总
📃文章前言
- 🔷文章均为学习工作中整理的笔记。
- 🔶如有错误请指正,共同学习进步。
Java设计模式面试题详解
一、设计模式基础概念
1. 设计模式的三大分类
- 创建型模式:处理对象创建机制(5种)
- 结构型模式:处理对象组合(7种)
- 行为型模式:处理对象间通信(11种)
2. SOLID原则
原则 | 全称 | 解释 |
---|---|---|
SRP | 单一职责原则 | 一个类只负责一个功能领域 |
OCP | 开闭原则 | 对扩展开放,对修改关闭 |
LSP | 里氏替换原则 | 子类可替换父类 |
ISP | 接口隔离原则 | 客户端不应依赖不需要的接口 |
DIP | 依赖倒置原则 | 依赖抽象而非具体实现 |
二、高频创建型模式面试题
1. 单例模式(Singleton)
问题:如何实现线程安全的单例?
// 双重检查锁定实现
public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
常见考点:
- volatile关键字的作用(禁止指令重排序)
- 反射攻击的防御(私有构造器中检查实例)
- 序列化破坏单例的解决方案(实现readResolve()方法)
2. 工厂方法模式(Factory Method)
问题:工厂方法模式与简单工厂的区别?
// 抽象工厂
interface CarFactory {Car createCar();
}// 具体工厂
class TeslaFactory implements CarFactory {public Car createCar() {return new Tesla();}
}class BMWFactory implements CarFactory {public Car createCar() {return new BMW();}
}
对比:
特点 | 简单工厂 | 工厂方法 |
---|---|---|
扩展性 | 修改工厂类 | 新增工厂类 |
符合OCP | ❌ | ✅ |
复杂度 | 低 | 中 |
3. 建造者模式(Builder)
问题:建造者模式的适用场景?
// 使用示例
Computer computer = new Computer.Builder().setCPU("Intel i7").setRAM("32GB").setStorage("1TB SSD").build();
适用场景:
- 创建包含多个组成部分的复杂对象
- 需要创建的对象有多个变体
- 需要精确控制创建过程
三、高频结构型模式面试题
1. 代理模式(Proxy)
问题:JDK动态代理和CGLib代理的区别?
特性 | JDK动态代理 | CGLib代理 |
---|---|---|
原理 | 基于接口 | 基于继承 |
速度 | 较快 | 首次慢,后续快 |
依赖 | 需实现接口 | 无接口要求 |
限制 | 只能代理接口方法 | 不能代理final方法 |
2. 适配器模式(Adapter)
问题:类适配器 vs 对象适配器
// 对象适配器实现
class EuropeanToAmericanAdapter implements AmericanPlug {private EuropeanPlug plug;public EuropeanToAmericanAdapter(EuropeanPlug plug) {this.plug = plug;}public void useAmericanOutlet() {plug.useEuropeanOutlet();// 转换逻辑...}
}
对比:
- 类适配器:通过继承实现(耦合度高)
- 对象适配器:通过组合实现(更灵活)
3. 装饰器模式(Decorator)
问题:装饰器模式与代理模式的区别?
// 装饰器示例
public class EncryptionDecorator extends DataSourceDecorator {public EncryptionDecorator(DataSource source) {super(source);}@Overridepublic void writeData(String data) {super.writeData(encrypt(data));}private String encrypt(String data) {// 加密逻辑...}
}
区别:
- 装饰器:动态添加功能,关注对象增强
- 代理:控制访问,关注访问过程
四、高频行为型模式面试题
1. 观察者模式(Observer)
问题:Java内置观察者API的缺点?
// Java 9+ 推荐实现
class NewsPublisher {private final List<Consumer<String>> listeners = new ArrayList<>();public void addListener(Consumer<String> listener) {listeners.add(listener);}public void publishNews(String news) {listeners.forEach(listener -> listener.accept(news));}
}
内置API缺点:
- Observable是类而非接口
- 没有线程安全保证
- 通知顺序不可控
- Java 9+已标记为过时
2. 策略模式(Strategy)
问题:如何消除if-else分支?
// 策略注册表
class PaymentStrategyFactory {private static final Map<String, PaymentStrategy> strategies = Map.of("ALIPAY", new AlipayStrategy(),"WECHAT", new WechatPayStrategy(),"CREDIT", new CreditCardStrategy());public static PaymentStrategy getStrategy(String type) {return strategies.getOrDefault(type, new DefaultStrategy());}
}
应用场景:
- 支付方式选择
- 排序算法切换
- 折扣计算策略
3. 责任链模式(Chain of Responsibility)
问题:Spring中如何实现责任链?
// Spring实现示例
@Component
@Order(1)
class ValidationFilter implements Filter {public void doFilter(Request request, Response response, FilterChain chain) {// 验证逻辑...chain.doFilter(request, response);}
}@Component
@Order(2)
class LoggingFilter implements Filter {public void doFilter(Request request, Response response, FilterChain chain) {// 日志记录...chain.doFilter(request, response);}
}
Spring特性:
- 使用@Order注解定义顺序
- 自动注入FilterChain实现
- 支持中断处理链
五、综合面试题
1. Spring框架中的设计模式应用
模式 | Spring应用场景 |
---|---|
工厂 | BeanFactory |
代理 | AOP实现 |
单例 | Bean默认作用域 |
模板 | JdbcTemplate |
适配器 | HandlerAdapter |
观察者 | ApplicationEvent |
策略 | Resource接口实现 |
2. 如何选择设计模式?
- 分析需求:明确要解决的问题类型
- 匹配模式:
- 创建对象 → 工厂/建造者
- 组合对象 → 组合/装饰器
- 对象交互 → 观察者/中介者
- 评估扩展性:考虑未来变化需求
- 权衡复杂度:避免过度设计
3. 设计模式六大原则实践
// 依赖倒置原则示例
interface MessageSender {void send(String message);
}class EmailSender implements MessageSender {public void send(String message) { /* 邮件发送 */ }
}class NotificationService {private final MessageSender sender; // 依赖抽象public NotificationService(MessageSender sender) {this.sender = sender;}public void sendNotification(String msg) {sender.send(msg);}
}
六、高频面试题汇总
-
单例模式如何防止反射攻击?
- 在私有构造器中检查实例是否存在
- 如果已存在则抛出异常
-
Spring Bean是线程安全的吗?
- 默认单例Bean不是线程安全的
- 解决方案:使用原型作用域、ThreadLocal或同步控制
-
装饰器模式和代理模式的主要区别?
- 装饰器:关注增强对象功能
- 代理:关注控制对象访问
-
观察者模式在哪些实际场景中使用?
- GUI事件处理
- 消息队列发布-订阅
- 电商系统库存通知
-
如何实现策略模式的无缝切换?
- 使用枚举或注册表管理策略
- 结合Spring的依赖注入
-
模板方法模式中钩子方法的作用?
- 提供默认空实现
- 允许子类选择性覆盖特定步骤
掌握设计模式的关键在于理解其应用场景和解决的问题,而非死记硬背实现代码。在面试中结合项目经验说明模式应用会更有说服力。
📜文末寄语
- 🟠关注我,获取更多内容。
- 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
- 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
- 🔵加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
- 🟣点击下方名片获取更多内容🍭🍭🍭👇