当前位置: 首页 > 后端技术 > Java

关于设计模式的话题,面试的时候又被问到

时间:2023-04-01 18:27:14 Java

面试官:我看到你的简历上说你熟悉常见的设计模式,那你不如来谈谈你熟悉哪些?候选:常见工厂模式、代理模式、模板方法模式、责任链模式、单例模式、包装设计模式、策略模式等。模板方法模式、责任链模式、策略模式、单例模式。考生:像工厂模式和代理模式,手写的不多,但毕竟Java后端一般用的是Spring,所以还是比较熟悉的。面试官:你手写单例模式怎么样?考生:单例模式一般有几种写法。候选:饿汉式、简单懒人式(方法声明时加锁)、DCL双重检查锁(高级懒人式)、静态内部类(优雅懒人式)公式)、枚举式候选:所谓的“饿汉式”style”表示对象在使用前直接初始化。所谓“懒人式”,是指用到时就等待初始化。考生:一般我们的项目中,单例会比较多以静态内部类的形式实现(如果没有Spring环境的话),代码简洁易读。考生:如果有Spring环境,直接交给Spring容器管理会更方便(Spring默认是单例)考生:枚举一般用作“标识”,项目中也写DCLbystudents(在一些源代码中也可以看到),但是总体来说不利于阅读和理解(:考生:一般情况下,你可以使用任何一个,关键我觉得看团队的代码风格(keepitconsistent),就算你用“饿汉式”也没什么大问题(现在内存不是那么匮乏,我觉得可读性更重要)面试官:嗯……面试官:我看你写了volatile修饰关于DCL的单例代码?为什么?考生:你不记得我们讲过volatile吗?指令可能乱序执行(编译器优化导致乱序,CPU缓存架构导致乱序,CPU原生重排导致乱序)考生:in当代码是newObject时,它不是一个原子指令,它会由几个步骤组成,在这个过程中,可能会出现指令重排的问题,关键字volatile可以避免指令重排的发生。面试官:那说说你在项目中使用的设计模式?考生:嗯,比如说我在处理请求的时候,我会用责任链模式来处理(减少ifelse,让项目结构更清晰)考生:在处理公共逻辑的时候,我会用模板方法模式来进行抽象,不同的具体逻辑会由不同的实现类来处理(每条消息发送前都需要文案校验,所以文案校验的逻辑可以写在抽象类上)候选人:代理模式手写机会比较少(因为项目一般都有一个Spring环境,直接使用Spring的AOP代理就可以了)考生:我之前用AOP封装了“监控客户端”,以“注解”的形式使用(不需要硬编码)进行监控,只要有注解)面试官:能说说Spring常用的设计模式吗?考生:比如SpringIOC容器,可以理解为应用了“工厂模式”(通过ApplicationContext或者BeanFactory获取对象)。考生:Spring对象默认是单例的,所以必须使用“单例模式”(源码中单例的实现是使用DCL实现单例)考生:SpringAOP的底层原理是使用“代理模式”。实现可能是JDK动态代理,也可能是CGLIB动态代理候选:Spring有很多地方使用了“模板方法模式”,比如事务管理器(AbstractPlatformTransactionManager),getTransaction定义了框架,其中很多都是由子类实现。考生:Spring的事件驱动模型使用的是“观察者模式”,具体实现是ApplicationContextEvent,ApplicationListener面试官:嗯,我明白了...欢迎关注我的微信公众号【Java3y】聊聊Java面试,以及在线面试官系列持续更新中!【在线面试官-手机版】系列,每周两篇,持续更新中!【在线面试官-电脑】系列每周两篇持续更新中!原创不易!!一连求三!!