Java设计模式高频面试题及详细答案_第1页
Java设计模式高频面试题及详细答案_第2页
Java设计模式高频面试题及详细答案_第3页
Java设计模式高频面试题及详细答案_第4页
Java设计模式高频面试题及详细答案_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java设计模式高频面试题及详细答案一、基础概念类(必问基础)1、什么是设计模式?为什么要使用设计模式?答案:设计模式是软件开发中总结出来的、通用的、可复用的代码设计经验,是解决特定场景下常见问题的标准化方案,专门用来优化代码结构、解决开发痛点。使用设计模式的核心目的有四点:1.复用代码:避免重复造轮子,通用逻辑标准化复用,提升开发效率;2.解耦代码:降低类与类、模块与模块之间的耦合度,让代码更独立;3.易于维护:代码结构规范统一,后续修改、迭代、排查问题更简单;4.统一认知:开发团队有统一的设计思路,沟通成本更低,新人上手更快。2、GoF23种设计模式分为哪三大类?核心区别是什么?答案:分为创建型、结构型、行为型三大类,核心区别聚焦在解决的问题场景不同:1.创建型模式(5种):重点解决对象创建问题,控制对象创建的数量、方式和时机,屏蔽对象创建细节。包含:单例、工厂方法、抽象工厂、建造者、原型模式。2.结构型模式(7种):重点解决类和对象的组合、装配问题,通过组合、继承优化代码结构,让类的结构更灵活。包含:适配器、装饰器、代理、组合、桥接、外观、享元模式。3.行为型模式(11种):重点解决对象之间的交互、职责分配、流程调度问题,规范对象的通信和行为逻辑。包含:策略、模板方法、观察者、迭代器、责任链、命令、状态、访问者、中介者、备忘录、解释器模式。3、设计模式的六大基本原则是什么?简单说说核心含义答案:六大原则是所有设计模式的底层设计思想,日常开发必须遵守:1.单一职责原则:一个类、一个方法只负责一件事,职责单一,避免代码臃肿、修改牵连过多逻辑。2.开闭原则(核心):对扩展开放,对修改关闭。新增功能尽量通过扩展实现,不要修改原有成熟代码,避免引入bug。3.里氏替换原则:子类可以完全替换父类出现在程序中,且替换后程序逻辑不受影响,子类不能重写父类已完善的核心逻辑。4.依赖倒置原则:高层模块不依赖低层模块,二者都依赖抽象;抽象不依赖细节,细节依赖抽象,核心是面向接口编程。5.接口隔离原则:使用多个细小的专用接口,代替一个臃肿的大接口,避免类依赖自己不需要的接口方法。6.迪米特法则(最少知道原则):一个类尽量少和其他类交互,只和直接朋友通信,降低类之间的关联复杂度。二、创建型模式(面试高频重点)1、单例模式是什么?有哪些实现方式?优缺点分别是什么?答案:单例模式是保证一个类在整个程序运行过程中,只有一个实例对象,并提供一个全局访问入口的创建型模式。常用于工具类、配置类、线程池等全局唯一对象场景。常见4种主流实现方式:1.饿汉式(静态常量)程序启动、类加载时直接创建实例,天生线程安全,实现简单。缺点是不管是否使用,都会占用内存,容易造成内存浪费,适合单例对象必定会使用的场景。2.懒汉式(线程不安全)首次调用获取实例方法时才创建对象,延迟加载、节省内存。缺点是多线程环境下会出现多个实例,线程不安全,基本不用于生产环境。3.双重检查锁DCL(推荐)在懒汉式基础上,通过两次判空+锁机制保证线程安全,同时实现延迟加载,内存利用率高,效率高,是业务开发最常用的单例实现方式。需要注意实例变量必须加volatile,防止指令重排导致空指针问题。4.枚举单例(最安全)利用枚举的特性实现单例,天生线程安全,杜绝反射、序列化破坏单例的问题,是面试公认最安全的单例模式。缺点是不支持延迟加载。2、如何破坏单例模式?怎么防止破坏?答案:日常有两种常见破坏方式:1.反射破坏:通过反射获取私有构造方法,手动创建新对象,打破单例唯一性;2.序列化破坏:单例对象序列化后再反序列化,会生成全新对象,破坏单例。防止方案:1.枚举单例天然防止反射和序列化破坏,是最优方案;2.DCL单例可以重写readResolve方法,解决序列化破坏问题;同时在构造方法中做判空校验,防止反射创建对象。3、工厂方法、抽象工厂、简单工厂的区别和适用场景?答案:三者核心都是封装对象创建逻辑,避免直接new对象,区别在于层级和扩展能力:1.简单工厂(非GoF标准模式)由一个统一的工厂类,通过判断条件创建不同的对象。优点是实现简单;缺点是违反开闭原则,新增产品需要修改工厂代码,适合产品种类少、基本不迭代的场景。2.工厂方法模式定义工厂接口,每个产品对应一个专属工厂类,一个工厂只生产一种产品。符合开闭原则,扩展方便;缺点是类数量会急剧增多,适合单一产品体系、频繁新增产品的场景。3.抽象工厂模式提供工厂接口,一个工厂可以生产一组关联的产品(产品族)。可以批量扩展产品体系,适合有多套产品族、产品分级的场景,比如家电工厂生产冰箱、空调整套产品。缺点是产品体系固定,新增单一产品时改动成本高。4、建造者模式和工厂模式的区别?适用什么场景?答案:核心区别:工厂模式重点是快速创建完整对象,不关注对象的构建过程;建造者模式重点是分步构建复杂对象,可以自定义构建步骤、调整参数顺序。建造者适用场景:对象属性多、参数繁杂、部分参数可选、对象构建步骤固定的场景。比如Java中的StringBuilder、MyBatis的SqlSessionFactory、实体类多参数构建,都是典型的建造者模式应用。可以有效避免重载构造方法过多、参数传参混乱的问题。三、结构型模式(面试高频)1、代理模式、装饰器模式、适配器模式的核心区别?极易混淆考点答案:三者都是包装原有对象,增强原有功能,但核心目的和场景完全不同:1.代理模式核心是控制访问,通过代理类代替真实对象对外提供服务,对原有功能进行拦截、增强、管控。原有代码完全无侵入,侧重权限控制、事务管理、日志记录、延迟加载。典型应用:SpringAOP、动态代理、MyBatisMapper代理。2.装饰器模式核心是增强功能,动态给原有对象叠加新功能,支持多层嵌套增强,原有核心功能不变。侧重对原有逻辑的拓展叠加。典型应用:JavaIO流(BufferedReader包装Reader)、咖啡加配料、商品叠加优惠。3.适配器模式核心是兼容适配,解决两个接口不兼容的问题,做转换、适配、翻译工作,让原本不匹配的类可以协同工作。典型应用:新旧系统接口对接、电压适配、SpringMVC的HandlerAdapter。2、静态代理和动态代理的区别?JDK动态代理和CGLIB代理区别?答案:静态代理:需要手动编写代理类,一个真实类对应一个代理类,代码冗余度高,扩展性差,新增业务需要新增代理类,现在基本不使用。动态代理:程序运行时动态生成代理类,无需手动编码,通用性强,是主流代理方式。JDK动态代理vsCGLIB代理1.JDK代理:必须基于接口,只能代理实现接口的类,通过反射生成接口代理对象,效率较高;2.CGLIB代理:无需接口,通过继承目标类生成子类实现代理,可以代理普通类,底层是字节码增强。缺点是无法代理final修饰的类和方法。Spring中默认规则:目标类有接口则用JDK代理,无接口则用CGLIB代理。3、享元模式是什么?解决什么问题?应用场景?答案:享元模式核心是对象复用,通过池化技术,复用大量重复的细粒度对象,减少内存占用。核心思想:区分内部状态和外部状态,内部不变的公共对象统一复用,外部变化的参数单独传递,避免重复创建相同对象。典型应用场景:Java常量池、字符串池、线程池、数据库连接池、Redis缓存。四、行为型模式(面试重点+业务常用)1、策略模式的原理、优缺点、适用场景答案:策略模式定义一系列独立的算法,将每个算法封装成单独的类,算法之间可以自由切换,由上下文类统一调度。核心优点:彻底消除if-else、switch多分支判断,符合开闭原则,新增算法只需新增策略类,无需修改原有代码,算法独立、互不影响。缺点:策略过多时会产生大量策略类,增加类文件数量。适用场景:同一业务有多种实现方式、算法频繁切换、分支逻辑繁多的场景。比如支付方式(微信、支付宝、银行卡)、折扣计算、文件解析、排序算法切换。2、模板方法模式和策略模式的区别?答案:1.模板方法模式:基于继承,父类定义固定的业务执行流程(模板),子类重写具体的步骤实现,流程固定、步骤可变。侧重统一流程规范。典型场景:Spring容器初始化、Servlet生命周期、通用审批流程。2.策略模式:基于组合接口,整套算法完全独立、可自由替换,无固定流程限制,算法整体替换。侧重算法替换。3、观察者模式原理及实际应用场景答案:观察者模式是一种事件订阅机制,定义一对多的依赖关系:一个主题(被观察者)状态发生变化时,所有订阅它的观察者会自动收到通知、触发更新。核心角色:被观察者、观察者、通知机制。实际应用场景:1.Spring事件驱动机制(ApplicationEvent、ApplicationListener);2.消息推送、订阅发布、MQ消息消费;3.前端页面监听、状态更新、订单状态变更通知。优点:发布者和订阅者解耦,支持一对多通知;缺点:观察者过多时通知效率低,存在循环依赖风险。4、责任链模式是什么?适用场景?Spring中的应用?答案:责任链模式将多个处理节点串联成一条链路,请求从链路头部传入,依次经过每个节点处理,每个节点可以选择处理请求、放行请求或终止请求。优点:请求和处理解耦,节点可自由组合、删减、排序,灵活调整处理流程。适用场景:多级审批、权限校验、参数校验、日志拦截、请求过滤。Spring典型应用:SpringMVC的拦截器链、SpringSecurity的过滤器链、异常处理器链路。五、综合面试题(进阶压轴)1、Spring框架中用到了哪些设计模式?举例说明答案:Spring核心源码大量运用设计模式,高频考点如下:1.单例模式:SpringBean默认单例,通过单例池统一管理Bean实例;2.工厂模式:BeanFactory、ApplicationContext作为Bean工厂,统一创建和管理Bean;3.代理模式:SpringAOP基于JDK/CGLIB动态代理实现切面增强;4.装饰器模式:BeanWrapper、各种资源加载器的包装增强;5.观察者模式:Spring事件发布订阅机制;6.模板方法模式:JdbcTemplate、TransactionTemplate,固定流程,自定义实现;7.责任链模式:拦截器链、过滤器链;8.适配器模式:HandlerAdapter适配不同的处理器。2、实际业务开发中,你用过哪些设计模式?举1-2个业务场景答案:(面试可直接口述,贴合业务)1.策略模式:在支付系统中,针对微信支付、支付宝、银行卡、余额支付四种方式,摒弃大量if-else判断,每种支付方式单独做一个策略类,统一实现支付接口,新增支付渠道直接新增策略类,代码更整洁、扩展性极强。2.责任链模式:在订单审批流程中,实现多级审核,普通订单、大额订单、特殊订单分别由不同节点处理,通过责任链串联,可灵活调整审批节点顺序、增减审批层级,无需改动核心流程。3.建造者模式:开发复杂DTO、查询参数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论