Skip to content

DesignPattern 面试专题手册

💡 本章节共收录 626 道面试真题,建议每天复习 10-20 题。


Q1: 请解释单例模式的双重检查锁实现,并说明volatile关键字的作用。

【核心解析】 双重检查锁通过两次判空和同步块实现线程安全;第一次判空避免不必要的同步;同步块保证实例创建原子性;第二次判空防止多个线程同时通过第一次检查;volatile禁止指令重排序,确保instance在完全初始化前不被其他线程看到。


Q2: 讲一下如何实现单例模式?

【核心解析】 饿汉式:类加载时创建实例,线程安全但可能浪费资源;懒汉式:延迟加载,需加synchronized保证线程安全;双重检查锁定(DCL):先判断null,加锁后再判断,使用volatile防止指令重排;静态内部类:利用类加载机制保证线程安全和延迟加载;枚举实现:最简洁,防止反射和序列化破坏。


Q3: 你了解哪些设计模式?在项目或实习中如何应用?

【核心解析】 常见设计模式包括单例、工厂、策略、观察者、代理等;在项目中应用:如使用工厂模式创建对象,策略模式实现不同算法,观察者模式实现事件通知;选择模式需考虑可维护性、扩展性和业务场景。


Q4: 说一下责任链和规则树怎么实现的,具体内容是什么?

【核心解析】 责任链模式:将请求沿着处理链传递,每个处理器决定是否处理或转发;实现方式:抽象处理者、具体处理者、链的组装;规则树:基于树形结构进行条件判断,每个节点代表规则,叶子节点为结果;实现方式:定义节点接口、条件节点、动作节点、树遍历。


Q5: 你的日志项目中用到了哪些设计模式?

【核心解析】 单例模式:全局日志管理器;工厂模式:根据配置创建不同sink;策略模式:切换同步写、异步写、按大小切分、按时间切分等策略;观察者模式:将日志事件同步给监控或告警模块;注意避免过度设计影响性能和可维护性。


Q6: 工厂模式在你的项目中是怎么用的?

【核心解析】 适用于创建逻辑复杂且对象种类会扩展的场景;日志系统中不同环境对应不同sink(控制台、文件、网络等);由工厂根据配置统一创建具体对象,外部依赖抽象接口;新增输出方式时无需修改调用方;示例:LogSinkFactory根据配置返回FileSink或NetworkSink。


Q7: 手撕:实现一个线程安全的单例模式,并说明懒汉模式下除了双重校验锁还有哪些实现方式。

【核心解析】 双重校验锁(DCL)使用 volatile 和 synchronized;静态内部类方式(利用类加载机制);枚举方式(天然线程安全);饿汉式(类加载时初始化);使用 CAS 实现。


Q8: 讲一下单例模式,懒汉模式下除了双重校验锁还有哪些方式实现?

【核心解析】 静态内部类方式;枚举方式;使用 synchronized 方法(性能较差);使用 CAS 实现(如 AtomicReference)。


Q9: 单例模式的实现方式有哪些?

【核心解析】 饿汉式、懒汉式(线程安全需加锁)、双重检查锁定、静态内部类、枚举。


Q10: 平时写代码有什么注意的点或者规范吗?

【核心解析】 命名清晰;单一职责;避免重复代码;注释合理;异常处理;性能考虑;代码审查。


Q11: 请具体讲一下责任链模式在你的项目中应用在什么场景?并对比责任链模式和装饰器模式的区别。

【核心解析】 责任链模式场景:审批流程、过滤器链、日志处理;责任链模式:请求沿链传递直到被处理;装饰器模式:动态增强对象功能;区别:目的不同(责任链解耦发送者和接收者,装饰器扩展功能);结构不同(责任链有后继者,装饰器包装对象)


Q12: 请介绍单例模式的概念和实现方式,并说明synchronized和volatile在其中的作用。

【核心解析】 单例模式确保一个类只有一个实例;实现方式包括饿汉式、懒汉式、双重检查锁定等;synchronized保证线程安全,volatile防止指令重排序并保证可见性。


Q13: 当时为什么选择这个框架?

【核心解析】 考虑框架的生态、性能、社区活跃度;满足项目需求如高并发、分布式;团队技术栈和熟悉度;可扩展性和维护性


Q14: 策略模式在动态选择中的应用与实现

【核心解析】 定义策略接口和具体策略类;使用上下文类持有策略引用;通过工厂或注册表动态选择策略;结合Spring注入实现解耦;适用场景:支付方式、促销活动等;优点:开闭原则、易于扩展


Q15: 请解释工厂模式,并举例说明如何实现。

【核心解析】 工厂模式:创建对象时封装实例化逻辑;简单工厂:一个工厂类根据参数返回不同产品;工厂方法:每个产品对应一个工厂;抽象工厂:创建产品族;示例:支付工厂根据支付类型创建支付宝或微信支付对象


Q16: 在项目中采用策略模式和模板方法模式,各自的用途和目的是什么?

【核心解析】 策略模式:定义算法族,封装可互换;模板方法:定义算法骨架,子类实现细节;策略模式用于行为选择,模板方法用于流程复用;策略模式避免条件判断,模板方法减少重复代码;两者结合使用


Q17: 请解释开闭原则(Open-Closed Principle)及其在程序扩展中的作用。

【核心解析】 对扩展开放,对修改关闭;通过抽象化实现,如接口、抽象类;避免修改已有代码,降低风险;常见实现:策略模式、模板方法模式。


Q18: 在多线程中处理多种业务类型时,如何通过抽象任务类或对象来设计?

【核心解析】 将业务逻辑封装为任务类,实现Runnable或Callable;使用策略模式或工厂模式创建不同任务;通过线程池执行;任务类可包含状态和上下文。


Q19: 手写工厂模式示例:简单工厂、工厂方法或抽象工厂的实现。

【核心解析】 简单工厂:一个工厂类根据参数创建不同产品;工厂方法:定义创建对象的接口,子类决定实例化哪个类;抽象工厂:创建相关或依赖对象的家族;示例:Shape接口,Circle、Rectangle实现,工厂类返回具体形状。


Q20: 单例模式的几种写法是什么?

【核心解析】 饿汉式、懒汉式(线程不安全)、synchronized懒汉式、双重检查锁定、静态内部类、枚举


Q21: 策略模式是什么?

【核心解析】 定义一组算法,将每个算法封装起来,使它们可以互相替换;策略模式让算法独立于使用它的客户端;包含策略接口、具体策略、上下文角色


Q22: Function Calling 的原理是什么?如果大模型返回的 Function Call 参数格式不对怎么办?

【核心解析】 Function Calling 允许大模型在生成回复时调用外部函数;原理是模型输出结构化数据(函数名和参数),系统解析后执行函数并返回结果;参数格式不对时,可重试、校验、或使用默认值;需要定义清晰的函数签名和参数约束。


Q23: 了解 MCP(Model Context Protocol)吗?

【核心解析】 MCP 是一种用于大模型与外部工具交互的协议;定义标准化的上下文传递方式;支持工具注册、调用和结果返回;提高模型与系统的互操作性。


Q24: Planner/Executor/Supervisor 模式的优点是什么?拆分为 3 个 agent 和只使用 1 个 agent,最关键的优势和区别是什么?

【核心解析】 Planner 负责规划任务,Executor 执行,Supervisor 监控和协调;优点包括职责分离、可扩展性、容错性;拆分为多个 agent 可并行处理、提高效率;单个 agent 简单但缺乏弹性;关键区别在于模块化和可维护性。


Q25: 请实现两种单例模式(如懒汉式和饿汉式),并说明其线程安全性。

【核心解析】 饿汉式:类加载时创建实例,线程安全,但可能造成资源浪费;懒汉式:延迟加载,需要加锁保证线程安全,如双重检查锁定(DCL)或静态内部类;DCL 需要 volatile 关键字防止指令重排;枚举单例天然线程安全且防止反射攻击。


Q26: 什么是策略模式?

【核心解析】 定义一组算法,将每个算法封装起来,使它们可以互相替换;策略模式让算法的变化独立于使用算法的客户端;包含上下文(Context)、策略接口(Strategy)和具体策略(ConcreteStrategy)三个角色;通过组合而非继承实现行为变化;典型应用:支付方式选择、排序算法、促销活动等。


Q27: 代理模式和装饰者模式有什么区别?

【核心解析】 代理模式控制对对象的访问,装饰者模式动态添加功能;代理模式通常与目标对象实现相同接口,装饰者模式通过包装增强功能;代理模式在编译时确定,装饰者模式在运行时递归组合;代理模式关注访问控制(如延迟加载、权限校验),装饰者模式关注功能扩展(如日志、缓存);代理模式通常由代理类创建目标对象,装饰者模式由客户端组合。


Q28: 手撕单例模式,包括线程安全的懒汉式、饿汉式、双重检查锁、静态内部类等实现方式。

【核心解析】 饿汉式:类加载时实例化,线程安全;懒汉式:延迟加载,需加 synchronized;双重检查锁:volatile + 两次检查,减少同步开销;静态内部类:利用类加载机制保证线程安全;枚举单例:天然防反射和序列化。


Q29: 常用的设计模式有哪些?

【核心解析】 单例模式、工厂模式、观察者模式、策略模式、代理模式、装饰器模式、适配器模式;每种模式的定义和典型应用;例如单例模式用于全局唯一实例,工厂模式用于对象创建。


Q30: 手写单例模式,你的实现是安全的吗?为什么?

【核心解析】 常见实现:饿汉式、懒汉式(synchronized)、双重检查锁定(volatile)、静态内部类、枚举;线程安全问题:指令重排、反射攻击、序列化破坏;推荐枚举或静态内部类实现;双重检查锁定需volatile禁止指令重排。


Q31: 实现一个线程安全的单例模式。

【核心解析】 饿汉式、懒汉式(synchronized)、双重检查锁定(volatile)、静态内部类、枚举


Q32: 手写单例模式,你的实现是安全的吗?为什么?

【核心解析】 常见实现:懒汉式(需加锁)、饿汉式(类加载时创建)、双重检查锁定(DCL)、静态内部类、枚举;DCL需使用volatile防止指令重排序;枚举实现天然线程安全且防止反射攻击;静态内部类利用类加载机制保证线程安全。


Q33: 设计模式中工厂模式和抽象工厂模式的区别是什么?

【核心解析】 工厂模式用于创建单一产品,抽象工厂模式用于创建产品族;工厂模式通过一个工厂类创建具体产品,抽象工厂模式通过多个工厂方法创建不同产品;工厂模式扩展需修改工厂类,抽象工厂模式扩展需增加工厂接口和具体工厂;抽象工厂模式符合开闭原则,但增加新产品族困难;工厂模式更简单,抽象工厂模式更灵活。


Q34: 请讲解你简历中提到的两种设计模式,并说明AOP切面在实习中是否有实际写过?

【核心解析】 设计模式:单例模式(饿汉、懒汉、双重检查锁)、工厂模式(简单工厂、工厂方法、抽象工厂);AOP切面:实际写过,如使用@Aspect实现日志记录、权限校验、事务管理;通过@Around、@Before等通知增强方法;利用切点表达式匹配目标方法。


Q35: 你在项目中使用了哪些设计模式?请举例说明。

【核心解析】 工厂模式创建Bean;代理模式实现AOP;模板方法模式定义算法骨架;责任链模式处理请求;策略模式优化if-else。


Q36: 责任链模式有什么优点?如果中途出现错误,如何回滚前面的操作?

【核心解析】 解耦请求处理者;每个阶段独立可扩展;支持动态组合;回滚需实现补偿机制或事务管理;通常结合工作流或Saga模式。


Q37: 大量使用if-else的代码块,适合用什么设计模式优化?

【核心解析】 策略模式;将不同逻辑封装为策略类;通过上下文选择策略;提高可扩展性和维护性;消除条件判断。


Q38: 使用设计模式实现天气预报:天气不同,用户收到通知,同时收到推荐行程。

【核心解析】 观察者模式:天气作为主题,用户作为观察者;策略模式:根据天气类型选择不同的推荐行程;工厂模式:创建不同的天气对象;组合模式:将通知和推荐行程组合处理。


Q39: 项目中的抽象类工厂模式具体说一说。

【核心解析】 抽象工厂模式:创建一组相关或依赖对象;包含抽象工厂、具体工厂、抽象产品、具体产品;与工厂方法区别:工厂方法单一产品,抽象工厂产品族;优点:隔离具体类,符合开闭原则;缺点:扩展产品族困难


Q40: 面向接口编程的优势有哪些?请结合实际场景说明。

【核心解析】 降低耦合性:依赖抽象而非具体实现;提高可扩展性:易于添加新实现;便于单元测试:可模拟接口;支持多态:同一接口不同行为;符合开闭原则:对扩展开放,对修改关闭;典型应用:Spring依赖注入、策略模式。


Q41: 请解释代理模式及其应用场景。

【核心解析】 代理模式:为其他对象提供一种代理以控制对这个对象的访问;静态代理:在编译时确定代理类;动态代理:运行时生成代理类(JDK动态代理、CGLIB);应用场景:AOP、远程代理、虚拟代理、保护代理。


Q42: 单例模式有哪些实现方式?懒汉式单例的并发问题如何解决?

【核心解析】 饿汉式、懒汉式、双重检查锁定、静态内部类、枚举;懒汉式并发问题:多个线程同时创建实例;解决:synchronized、volatile禁止指令重排、双重检查锁定。


Q43: 请简述开闭原则,哪些原则与它相关,分别是什么关系?什么是里氏替换原则?什么是依赖倒置原则?

【核心解析】 开闭原则指对扩展开放、对修改关闭;里氏替换原则是子类应能替换父类且不改变程序正确性,是开闭原则的实现基础;依赖倒置原则指高层模块不应依赖低层模块,两者都应依赖抽象,抽象不应依赖细节,细节应依赖抽象,也是实现开闭原则的手段。


Q44: 请介绍创建型设计模式中的单例模式(多线程环境)、工厂模式和抽象工厂模式。

【核心解析】 单例模式确保类只有一个实例,多线程下需考虑双重检查锁定或静态内部类等线程安全实现;工厂模式定义一个创建对象的接口,让子类决定实例化哪个类;抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类。


Q45: 请介绍结构型设计模式中的代理模式和装饰器模式。

【核心解析】 代理模式为其他对象提供一种代理以控制对这个对象的访问,如远程代理、虚拟代理等;装饰器模式动态地给对象添加额外职责,比继承更灵活,通过组合方式扩展功能。


Q46: 请解释组合模式、责任链模式、策略模式和观察者模式的定义、适用场景及优缺点。

【核心解析】 组合模式:将对象组合成树形结构以表示部分-整体层次,使客户端统一对待单个对象和组合对象;责任链模式:使多个对象都有机会处理请求,避免请求发送者与接收者耦合,将对象连成链并沿链传递请求;策略模式:定义一系列算法,将每个算法封装起来,使它们可以相互替换,且算法变化独立于使用算法的客户;观察者模式:定义对象间一对多依赖,当一个对象状态改变时,所有依赖者自动收到通知并更新。


Q47: 手写观察者模式。

【核心解析】 定义主题接口(Subject)包含注册、移除、通知观察者方法;定义观察者接口(Observer)包含更新方法;具体主题维护观察者列表,状态变化时通知所有观察者;具体观察者实现更新方法,响应主题变化。


Q48: 请手写策略模式和观察者模式的代码示例。

【核心解析】 策略模式:定义策略接口、具体策略类、上下文类;观察者模式:定义主题接口、观察者接口、具体主题和具体观察者;Java中Observer接口和Observable类的使用


Q49: 请解释策略模式和工厂模式的区别及应用场景。

【核心解析】 策略模式:定义一系列算法,将每个算法封装起来,使它们可以互相替换,客户端选择策略;工厂模式:创建对象,将对象的创建和使用分离,包括简单工厂、工厂方法和抽象工厂;策略模式关注行为的选择,工厂模式关注对象的创建;策略模式通常与工厂模式结合使用,工厂创建策略对象。


Q50: 访问者模式(Visitor Pattern)的原理和实现,结合AST语法树访问的场景。

【核心解析】 访问者模式将数据结构与操作分离,通过accept方法接受访问者;适用于对象结构稳定但操作频繁变化的场景;AST中每个节点实现accept,访问者实现不同操作。


Q51: 请抽象地讲解装饰器模式,包括其定义、结构、优缺点及应用场景。

【核心解析】 定义:动态给对象添加额外职责,比继承更灵活;结构:Component接口、ConcreteComponent、Decorator抽象类、ConcreteDecorator;优点:遵循开闭原则,避免类爆炸;缺点:多层装饰增加复杂度;应用场景:Java I/O流、Spring AOP、日志、权限校验;与代理模式区别:装饰器增强功能,代理控制访问。


Q52: 请详细解释单例模式和观察者模式,包括实现方式和应用场景。

【核心解析】 单例模式:确保一个类只有一个实例,提供全局访问点;实现方式有饿汉式、懒汉式(双重检查锁定)、静态内部类、枚举;观察者模式:定义一对多依赖,当主题状态变化时通知所有观察者;Java中可用Observable/Observer或事件监听器实现。


Q53: 请列举你熟悉的设计模式,并举例说明在项目中的应用。

【核心解析】 常见设计模式:单例模式(数据库连接池)、工厂模式(创建对象)、策略模式(支付方式选择)、观察者模式(事件监听)、模板方法模式(框架流程)等。


Q54: 请解释面向对象设计原则中的里氏替换原则和依赖倒置原则。

【核心解析】 里氏替换原则:子类对象必须能够替换父类对象,且程序行为不变;即子类不应重写父类的非抽象方法,应扩展而非修改;依赖倒置原则:高层模块不应依赖低层模块,两者都应依赖抽象;抽象不应依赖细节,细节应依赖抽象;通过接口或抽象类实现解耦。


Q55: 请列举几种常见的设计模式,并说明其应用场景。

【核心解析】 单例模式:确保类只有一个实例,如配置管理器;工厂模式:创建对象而不暴露创建逻辑,如简单工厂、工厂方法、抽象工厂;观察者模式:一对多依赖,当对象状态变化时通知所有观察者,如事件监听;策略模式:定义一系列算法,封装每个算法,使它们可以互换,如排序策略;代理模式:为其他对象提供代理以控制访问,如远程代理、虚拟代理。


Q56: 手写单例模式(双重检查锁、静态内部类、枚举等)并说明线程安全性。

【核心解析】 饿汉式:类加载时创建,线程安全但可能浪费资源;懒汉式:synchronized 方法或双重检查锁(volatile 防止指令重排);静态内部类:利用类加载机制保证线程安全;枚举:天然单例且防反射/序列化;推荐使用枚举或静态内部类


Q57: 请介绍各种单例模式的实现方式,特别是懒汉式单例如何实现?

【核心解析】 饿汉式:类加载时初始化;懒汉式:延迟加载,需考虑线程安全;双重检查锁定(DCL)实现懒汉式;静态内部类方式;枚举方式;懒汉式需加synchronized或使用DCL+volatile。


Q58: 讲一下单例模式有哪些类型,懒汉式DCL锁为什么要检查两次

【核心解析】 单例模式类型包括饿汉式、懒汉式、双重检查锁定(DCL)、静态内部类、枚举等;DCL中第一次检查是为了避免不必要的同步,第二次检查是为了在进入同步块后确保实例未被其他线程创建,从而保证线程安全。


Q59: 请解释单例模式和适配器模式,并手写单例模式的线程安全实现。

【核心解析】 单例模式:确保一个类只有一个实例,提供全局访问点;线程安全实现:双重检查锁定(volatile + synchronized)、静态内部类、枚举;适配器模式:将一个类的接口转换成客户期望的另一个接口,使不兼容的类能一起工作;对象适配器通过组合实现,类适配器通过继承实现。


Q60: 请列举并解释几种常见的设计模式,如单例、工厂、观察者、代理模式。

【核心解析】 单例模式确保类只有一个实例;工厂模式封装对象创建逻辑;观察者模式定义一对多依赖;代理模式为其他对象提供代理以控制访问。


Q61: 工厂模式有哪几种?Spring源码中使用了哪些设计模式?

【核心解析】 简单工厂、工厂方法、抽象工厂;Spring中:单例模式(Bean默认作用域)、工厂模式(BeanFactory)、代理模式(AOP)、模板方法(JdbcTemplate)、观察者模式(事件监听)等。


Q62: 你熟悉哪些设计模式?它们有什么区别?什么情况下使用工厂方法?

【核心解析】 常见模式:单例、工厂、代理、观察者、策略、模板方法等;区别在于目的和适用场景;工厂方法适用于创建对象时需延迟到子类决定具体类,或客户端不需要知道具体产品类。


Q63: 单例模式的实现方式有哪些?两种常见方式各有什么优缺点?

【核心解析】 饿汉式:类加载时创建实例,线程安全,但可能造成资源浪费;懒汉式:首次使用时创建,需加锁保证线程安全,性能较低;双重检查锁定(DCL)和静态内部类可兼顾性能与安全。


Q64: 面向对象的设计原则有哪些?策略模式的实现?

【核心解析】 SOLID原则(单一职责、开闭、里氏替换、接口隔离、依赖倒置);策略模式:定义算法族,分别封装,使其可互换;实现:策略接口、具体策略类、上下文类


Q65: 策略模式的实现方式及面向对象设计原则

【核心解析】 策略模式:定义算法族,分别封装,使其可互换;符合开闭原则;通过接口或抽象类定义策略,具体策略实现接口;上下文持有策略引用,动态切换


Q66: 请解释单例模式的定义、实现方式(懒汉式、饿汉式、双重检查锁定、静态内部类、枚举)及其优缺点,并举例说明在计算机系统中的应用。

【核心解析】 单例模式确保类只有一个实例,并提供全局访问点;懒汉式延迟加载但线程不安全;饿汉式线程安全但可能造成资源浪费;双重检查锁定兼顾线程安全和性能;静态内部类利用类加载机制保证线程安全;枚举实现最简洁且防止反序列化;应用包括线程池、缓存、日志对象、打印机驱动程序等。


Q67: 请介绍你熟悉的设计模式(如单例模式)和设计原则(如开闭原则)。

【核心解析】 单例模式:确保类只有一个实例,提供全局访问点,实现方式有饿汉、懒汉、双重检查、静态内部类、枚举;开闭原则:对扩展开放,对修改关闭,通过抽象和接口实现;其他原则:单一职责、里氏替换、依赖倒置、接口隔离、迪米特。


Q68: 面向对象的设计原则有哪些?请举例策略模式的实现。

【核心解析】 原则:单一职责、开闭、里氏替换、依赖倒置、接口隔离、迪米特;策略模式:定义算法族,分别封装,可互换;实现:策略接口、具体策略类、上下文类


Q69: 双重校验锁和静态内部类实现单例模式的原理是什么?如何理解面向对象?

【核心解析】 双重校验锁:第一次判空避免不必要的同步,第二次判空保证实例唯一性,volatile防止指令重排;静态内部类:利用类加载机制保证线程安全,内部类在首次引用时加载,延迟初始化;面向对象理解:封装、继承、多态,抽象和模块化。


Q70: 除了单例,还知道什么设计模式?在什么场景下使用?

【核心解析】 工厂模式:对象创建;策略模式:算法替换;观察者模式:事件驱动;代理模式:AOP;适配器模式:接口兼容


Q71: 单例模式

【核心解析】 确保一个类只有一个实例;饿汉式:类加载时创建;懒汉式:首次使用时创建,需加锁;双重检查锁定;静态内部类;枚举实现


Q72: HashMap 中使用了哪些设计模式?请举例说明。

【核心解析】 迭代器模式(Iterator);工厂方法模式(如Node的创建);模板方法模式(如resize());单例模式(如Collections.singletonMap)


Q73: 简单工厂模式、工厂方法模式、抽象工厂模式的区别是什么?

【核心解析】 简单工厂:一个工厂类根据参数创建产品;工厂方法:每个产品对应一个工厂类,通过继承实现;抽象工厂:创建一组相关或依赖的产品族,强调产品族;简单工厂违反开闭原则,工厂方法和抽象工厂遵循开闭原则


Q74: 请详细讲解单例模式的实现方式、优缺点及适用场景。

【核心解析】 饿汉式(线程安全,类加载时初始化);懒汉式(延迟加载,需同步);双重检查锁定(DCL,推荐);静态内部类(延迟加载,线程安全);枚举实现(最安全,防反射和序列化)。


Q75: 请解释策略模式的实现。

【核心解析】 策略模式定义一组算法,将每个算法封装起来,使它们可以互相替换;包含策略接口、具体策略类、上下文类;上下文持有策略接口引用,通过构造函数或setter注入。


Q76: 请解释面向对象的设计原则。

【核心解析】 单一职责原则:一个类只负责一个职责;开闭原则:对扩展开放,对修改关闭;里氏替换原则:子类可替换父类;依赖倒置原则:依赖抽象而非具体;接口隔离原则:接口尽量小;迪米特法则:最少知道。


Q77: 设计模式的六大原则是什么?

【核心解析】 单一职责原则(一个类只负责一个职责);开闭原则(对扩展开放,对修改关闭);里氏替换原则(子类可替换父类);依赖倒置原则(依赖抽象而非具体);接口隔离原则(接口尽量小);迪米特法则(最少知道原则)。


Q78: 常见设计模式有哪些?

【核心解析】 单例模式:确保全局唯一实例;工厂模式:创建对象;观察者模式:事件通知;策略模式:算法替换;代理模式:控制访问;适配器模式:接口兼容。


Q79: 单例模式在多线程环境下有哪些问题?如何解决?

【核心解析】 问题:多个线程同时获取实例可能导致创建多个对象;解决方案:使用双重检查锁定(DCL)加volatile关键字;或使用静态内部类(线程安全且延迟加载);或使用枚举实现单例(天然线程安全);注意指令重排序问题。


Q80: 请介绍责任链模式在你项目中的应用场景和实现方式。

【核心解析】 责任链模式用于请求处理链,如审批流程、日志过滤、请求拦截;每个处理器决定是否处理或传递给下一个;优点包括解耦、灵活扩展;实现方式包括链表或数组存储处理器。


Q81: 面向对象设计原则

【核心解析】 单一职责:一个类只做一件事;开闭原则:对扩展开放,对修改关闭;里氏替换:子类可替换父类;接口隔离:接口尽量小;依赖倒置:依赖抽象而非具体;迪米特法则:最少知识


Q82: 常用设计模式有哪些?请举例说明其应用场景,并谈谈选择设计模式的原则。

【核心解析】 单例模式:数据库连接池、日志管理器、配置管理器,保证全局唯一实例,注意线程安全(双重检查锁、局部静态变量);工厂模式:创建不同类型的对象,解耦对象创建和使用,如根据配置创建不同的消息处理器;策略模式:支付方式选择(微信、支付宝、银行卡),不同的加密算法,避免大量if-else;观察者模式:事件通知系统,订单状态变化通知多个模块;装饰器模式:给对象动态添加功能,如日志、性能监控、权限检查;责任链模式:请求处理流程,如参数校验→权限验证→业务处理→日志记录;选择原则:根据实际需求,不要为了用设计模式而用,重点是代码的可维护性、可扩展性和可读性。


Q83: 请解释写时拷贝(Copy-on-Write)技术的原理、应用场景和优缺点。

【核心解析】 原理:多个对象共享同一份数据,只有在修改时才真正拷贝;应用场景:C++字符串实现(早期std::string)、Linux进程fork(父子进程共享物理内存,写入时拷贝页面)、数据库快照和备份、容器浅拷贝优化、文件系统(如Btrfs、ZFS);优点:减少内存占用,提高拷贝性能,避免不必要的深拷贝;缺点:线程安全问题,修改时需检查引用计数并拷贝,通常配合引用计数实现。


Q84: 设计模式里,里氏替换原则你能通俗解释一下吗

【核心解析】 里氏替换原则指子类可以替换父类且程序行为不变;子类不能重写父类已实现的方法逻辑;子类可以扩展父类功能但不能改变父类原有功能;违反该原则会导致继承体系脆弱;典型反例:正方形继承矩形并重写宽高设置方法


Q85: 什么是观察者模式?为什么设计成观察者模式?

【核心解析】 观察者模式定义了一对多依赖关系,当主题状态变化时通知所有观察者;优点:解耦、支持广播通信、符合开闭原则;适用场景:事件驱动系统、消息通知、MVC架构;实现方式:Java中的Observable/Observer接口或自定义事件监听器。


Q86: 适配器模式在Java常见类库中有哪些应用?

【核心解析】 java.util.Arrays.asList()将数组适配为List;InputStreamReader将InputStream适配为Reader;Collections.enumeration()将Iterator适配为Enumeration;Spring中的HandlerAdapter适配不同Controller类型


Q87: 单例模式在多线程或多进程环境下会存在几个实例?如何实现线程安全的单例?

【核心解析】 单例模式保证一个类只有一个实例;多线程下需同步(如双重检查锁定、静态内部类、枚举);多进程下每个进程各有一个实例,需进程间同步(如文件锁);Java中枚举单例天然线程安全且防反射


Q88: 写一个单例类(线程安全)。

【核心解析】 饿汉式:类加载时初始化实例,线程安全;懒汉式:双重检查锁定(DCL)或静态内部类;使用volatile防止指令重排;枚举单例最简单且安全。


Q89: 你用过哪些设计模式?请举例说明。

【核心解析】 单例模式:确保全局唯一实例;工厂模式:解耦对象创建;观察者模式:事件驱动;策略模式:算法替换;代理模式:控制访问。


Q90: 适配器模式在Java中有哪些常见的应用?

【核心解析】 InputStreamReader适配InputStream到Reader;OutputStreamWriter适配OutputStream到Writer;List接口的Arrays.asList()适配数组到List;Spring中的HandlerAdapter适配不同的控制器


Q91: 适配器模式在哪些常见类中得到了应用?请举例说明。

【核心解析】 Java I/O中的InputStreamReader和OutputStreamWriter;Spring中的HandlerAdapter;JDBC驱动中的适配器。


Q92: 请详细解释观察者模式,包括其定义、结构、适用场景以及优缺点。

【核心解析】 定义一对多依赖关系;主题与观察者接口;松耦合;支持广播通信;可能引起性能问题或循环依赖


Q93: 为什么LRU缓存设计成观察者模式?请解释观察者模式的概念及其适用场景。

【核心解析】 观察者模式定义一对多依赖,当主题状态变化时通知所有观察者;LRU缓存本身不是观察者模式,但可用观察者模式实现缓存失效通知;适用场景:事件驱动系统、消息通知、MVC架构


Q94: 请分别说明工厂模式和策略模式的应用场景,并举例说明。

【核心解析】 工厂模式:用于创建对象,如日志记录器工厂;策略模式:用于算法族封装,如支付方式选择。


Q95: 手撕责任链模式,并解答以下问题:1)责任链模式的作用是什么;2)责任链模式和工厂类的区别是什么?

【核心解析】 作用:解耦请求发送者和接收者,使多个对象都有机会处理请求,形成链式处理;与工厂类区别:工厂类负责创建对象,责任链模式负责处理请求,工厂类通常不涉及处理逻辑;实现:定义抽象处理者,具体处理者实现处理逻辑并持有下一个处理者引用。


Q96: 设计模式的开闭原则是什么?如何设计?

【核心解析】 对扩展开放,对修改关闭;通过抽象接口、策略模式、模板方法等实现


Q97: 请手写单例模式,并说明其使用场景。

【核心解析】 饿汉式:类加载时创建实例;懒汉式:首次使用时创建;双重检查锁定(DCL);静态内部类方式;枚举方式;使用场景:配置类、连接池、线程池、日志对象;确保全局唯一实例


Q98: 请实现一个线程安全的单例模式,并说明其应用场景。

【核心解析】 饿汉式、懒汉式、双重检查锁定、静态内部类、枚举实现;线程安全与延迟加载的权衡;单例模式在配置管理、连接池等场景的应用。


Q99: 请介绍你了解的设计模式,并详细讲解策略模式(Strategy Pattern)的实现和应用场景。

【核心解析】 策略模式定义一系列算法,将每个算法封装起来,并使它们可以互换;包含上下文、策略接口和具体策略;应用场景如支付方式选择、排序算法切换;Go中可通过接口实现策略模式。


Q100: 请分析以下单例模式代码的问题,并给出改进方案。代码为饿汉式单例,未使用双重检查锁定和 volatile 关键字。

【核心解析】 饿汉式单例在类加载时创建实例,线程安全但可能造成资源浪费;未使用 volatile 可能导致指令重排序问题;双重检查锁定(DCL)需加 volatile 禁止重排序;改进:使用静态内部类或枚举实现;枚举单例天然防止反射和序列化破坏。


Q101: 请列举几种常见的设计模式,并说明其应用场景。

【核心解析】 单例模式:全局唯一实例;工厂模式:创建对象;观察者模式:事件通知;策略模式:算法替换;代理模式:控制访问;模板方法模式:定义算法骨架。


Q102: 请介绍单例模式的几种实现方式,并比较它们的优缺点。

【核心解析】 饿汉式(线程安全,但可能浪费资源);懒汉式(需同步,性能差);双重检查锁定(DCL,需volatile);静态内部类(延迟加载,线程安全);枚举(最安全,防止反射攻击)。


Q103: 请列举常见的设计模式及其应用场景。

【核心解析】 单例模式(数据库连接池);工厂模式(对象创建);观察者模式(事件监听);代理模式(AOP);策略模式(算法替换);模板方法模式(框架流程)。


Q104: 请介绍常见的设计模式,并举例说明。

【核心解析】 单例模式(饿汉、懒汉)、工厂模式(简单工厂、工厂方法、抽象工厂)、代理模式(静态、动态)、观察者模式、策略模式等。


Q105: 项目中分布式锁组件封装中是如何应用工厂模式和策略模式的

【核心解析】 工厂模式创建锁实例;策略模式选择锁实现;扩展性;配置驱动;代码示例


Q106: 请分析以下单例模式代码的问题,并给出改进方案:饿汉式单例如何保证线程安全?为什么需要双重检查锁定和volatile关键字?

【核心解析】 饿汉式单例在类加载时创建实例,线程安全但可能造成资源浪费;懒汉式需双重检查锁定避免多次加锁性能问题;volatile防止指令重排序导致未初始化对象被访问;实际应用中推荐使用静态内部类或枚举实现单例。


Q107: 请分析单例模式的优缺点,并说明如何保证单例模式在并发环境下的线程安全。

【核心解析】 优点:节省资源、全局唯一访问点;缺点:扩展性差、违反单一职责、测试困难;线程安全实现:饿汉式、懒汉式(synchronized)、双重检查锁定(volatile)、静态内部类、枚举。