资讯专栏INFORMATION COLUMN

又被面试官问设计模式了,我真的是

不知名网友 / 1870人阅读

摘要:面试官要不你来手写下单例模式呗候选者单例模式一般会有好几种写法候选者饿汉式简单懒汉式在方法声明时加锁双重检验加锁进阶懒汉式静态内部类优雅懒汉式枚举候选者所谓饿汉式指的就是还没被用到,就直接初始化了对象。

面试官我看你的简历写着熟悉常见的设计模式,要不你来简单聊聊你熟悉哪几个吧?

候选者:常见的工厂模式、代理模式、模板方法模式、责任链模式、单例模式、包装设计模式、策略模式等都是有所了解的

候选者:项目手写代码用得比较多的,一般就模板方法模式、责任链模式、策略模式、单例模式吧

候选者:像工厂模式、代理模式这种,手写倒是不多,但毕竟Java后端一般环境下都用Spring嘛,所以还是比较熟悉的。

面试官要不你来手写下单例模式呗?

候选者:单例模式一般会有好几种写法

候选者:饿汉式、简单懒汉式(在方法声明时加锁)、DCL双重检验加锁(进阶懒汉式)、静态内部类(优雅懒汉式)、枚举

候选者:所谓「饿汉式」指的就是还没被用到,就直接初始化了对象。所谓「懒汉式」指的就是等用到的时候,才进行初始化

候选者:那我就都写写吧,反正就那些代码

面试官:那你们用的哪种比较多?

候选者:一般我们项目里用静态内部类的方式实现单例会比较多(如果没有Spring的环境下),代码简洁易读

候选者:如果有Spring环境,那还是直接交由Spring容器管理会比较方便(Spring默认就是单例的)

候选者:枚举一般我们就用它来做「标识」吧,而DCL这种方式也有同学会在项目里写(在一些源码里也能看到其身影),但总体太不利于阅读和理解(:

候选者:总的来说,用哪一种都可以的,关键我觉得要看团队的代码风格吧(保持一致就行),即便都用「饿汉式」也没啥大的问题(现在内存也没那么稀缺,我认为可读性比较重要)

面试官:嗯...

面试官我看你在DCL的单例代码上,写了volatile修饰嘛?为什么呢?

候选者:你不记得我们曾经聊过volatile的了嘛?指令是有可能乱序执行的(编译器优化导致乱序、CPU缓存架构导致乱序、CPU原生重排导致乱序)

候选者:在代码new Object的时候,不是一条原子的指令,它会由几个步骤组成,在这过程中,就可能会发生指令重排的问题,而volatile这个关键字就可以避免指令重排的发生。

面试官那你说下你在项目里用到的设计模式吧?

候选者:嗯,比如说,我这边在处理请求的时候,会用到责任链模式进行处理(减免if else 并且让项目结构更加清晰)

候选者:在处理公共逻辑时,会使用模板方法模式进行抽象,具体不同的逻辑会由不同的实现类处理(每种消息发送前都需要经过文案校验,所以可以把文案校验的逻辑写在抽象类上)

候选者:代理模式手写的机会比较少(因为项目一般有Spring环境,直接用Spring 的AOP代理就好了)

候选者:我之前使用过AOP把「监控客户端」封装以「注解」的方式进行使用(不用以硬编码的方式来进行监控,只要有注解就行了)

面试官那你能聊聊Spring常见的设计模式嘛?

候选者:比如,Spring IOC容器可以理解为应用了「工厂模式」(通过ApplicationContext或者BeanFactory去获取对象)

候选者:Spring的对象默认都是单例的,所以肯定是用了「单例模式」(源码里对单例的实现是用的DCL来实现单例)

候选者:Spring AOP的底层原理就是用了「代理模式」,实现可能是JDK 动态代理,也可能是CGLIB动态代理

候选者:Spring有很多地方都用了「模板方法模式」,比如事务管理器(AbstractPlatformTransactionManager),getTransaction定义了框架,其中很多都由子类实现

候选者:Spring的事件驱动模型用了「观察者模式」,具体实现就是ApplicationContextEvent、ApplicationListener

面试官:嗯,了解...

欢迎关注我的微信公众号【Java3y】来聊聊Java面试,对线面试官系列持续更新中!

【对线面试官-移动端】系列 一周两篇持续更新中!

【对线面试官-电脑端】系列 一周两篇持续更新中!

原创不易!!求三连!!

更多的文章可往:文章的目录导航

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125108.html

相关文章

  • 经常被面官问到的JavaScript数据类型知识你真的懂吗?

    摘要:中的强制转换规则面试官中强制类型转换是一个非常易出现的点,知道强制转换时候的规则吗注规则最好配合下面什么时候发生转换使用这些规则看效果更佳。调用方法用来把对象转换成原始类型的值数值字符串和布尔值。 前言 showImg(https://segmentfault.com/img/bVbu4Fb?w=940&h=400);之前面试了几个开发者,他们确实做过不少项目,能力也是不错的,但是发现...

    codergarden 评论0 收藏0
  • 简历上的项目经历怎么写 ?这 3 条原则不可忽视 !

    摘要:正因为如此,现在很多简历上的项目经历的质量都是参差不齐,同时有的项目经历又非常相似,面试官一眼就能知道你的项目到底是真是假。虽然以上三点原则不能包治百病,但是对很多同学来说应该是蛮有益处的。阅读本文大概需要 5 分钟。作者:黄小斜showImg(https://user-gold-cdn.xitu.io/2019/3/30/169cdb4bd2cac24c);​作为一个程序员,想必大家曾经都...

    fobnn 评论0 收藏0
  • 一个 1年工作经验的 PHP 程序员如何被面试官虐的?

    摘要:准备不充分第一轮不过第一家,广州琶洲一家环境超级好,福利也不错,主营美颜的公司,这也是我最感遗憾的一次面试机会。主要是第一轮面试第一个问题的种数据类型,只答了一个。 前言 首先需要说明的一点,本人只是一个毕业一年,只有一年工作经验的普通PHPer,能力有限,这篇文章只是将我这几周来的感受和体验分享出来,希望能给许多像我一样,或者互联网行业的新手带来一些收获,当然哪里说的不对或不足还是希...

    pcChao 评论0 收藏0
  • 朋友去大厂面试Python开发工程师,看完准备过程傻眼

    摘要:要面试大厂,自己的知识储备一定要非常丰富,若缺胳膊少腿,别说在实际工作当中,光是面试这一关就过不了。 金九银十刚过去,有一部分朋友在这期间肯定经历了一番大厂面试的洗...

    felix0913 评论0 收藏0

发表评论

0条评论

不知名网友

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<