当前位置: 首页 > news >正文

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. 如何选择设计模式?

  1. 分析需求:明确要解决的问题类型
  2. 匹配模式
    • 创建对象 → 工厂/建造者
    • 组合对象 → 组合/装饰器
    • 对象交互 → 观察者/中介者
  3. 评估扩展性:考虑未来变化需求
  4. 权衡复杂度:避免过度设计

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);}
}

六、高频面试题汇总

  1. 单例模式如何防止反射攻击?

    • 在私有构造器中检查实例是否存在
    • 如果已存在则抛出异常
  2. Spring Bean是线程安全的吗?

    • 默认单例Bean不是线程安全的
    • 解决方案:使用原型作用域、ThreadLocal或同步控制
  3. 装饰器模式和代理模式的主要区别?

    • 装饰器:关注增强对象功能
    • 代理:关注控制对象访问
  4. 观察者模式在哪些实际场景中使用?

    • GUI事件处理
    • 消息队列发布-订阅
    • 电商系统库存通知
  5. 如何实现策略模式的无缝切换?

    • 使用枚举或注册表管理策略
    • 结合Spring的依赖注入
  6. 模板方法模式中钩子方法的作用?

    • 提供默认空实现
    • 允许子类选择性覆盖特定步骤

掌握设计模式的关键在于理解其应用场景解决的问题,而非死记硬背实现代码。在面试中结合项目经验说明模式应用会更有说服力。


📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

相关文章:

  • 内存分配基础:修改SCT文件的简单例子
  • HBM 读的那些事
  • 网络编程(TCP编程)
  • UDP与TCP通信协议技术解析
  • GD图像处理与SESSiON
  • 禅道18.2集成LDAP
  • Linux 文件系统底层原理笔记:磁盘结构、ext2 文件系统与软硬链接解析
  • C++----剖析list
  • 前沿探索:可视化助力设备运维实现跨越式发展
  • 分析 java 的 Map<String,Map<String, List<Map<String,Integer>>>>
  • 初入 python Django 框架总结
  • Reasoning over Uncertain Text by Generative Large Language Models
  • 《Spring Boot 微服务架构下的高并发活动系统设计与实践》
  • webstorm 配置Eslint
  • 量子计算导论课程设计 之 PennyLane环境搭建
  • 深入了解linux系统—— 共享内存
  • 【每天学点 Go 知识】Go 基础知识 + 基本数据类型快速入门
  • 【Hot 100】139. 单词拆分
  • arduino Nano+asrpro2.0制作桌面宠物
  • (javaEE)网络原理-初识 局域网和广域网 ip地址和端口号 协议 五元组 协议分层 OSI七层模型 网络数据通信的基本流程
  • 餐饮网站建设方案书/seo关键词布局技巧
  • 辽宁省建设工程信息网首页官网/北京seo教师
  • 网站建设易网宣/站长工具权重查询
  • 做企业网站步骤/互联网推广是什么工作内容
  • 大型网站建设的难点是什么/深圳百度关键词
  • 怎么在360网站做词条/crm软件