<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          《對線面試官》設(shè)計(jì)模式

          共 1522字,需瀏覽 4分鐘

           ·

          2022-05-26 06:45

          面試官我看你的簡歷寫著熟悉常見的設(shè)計(jì)模式,要不你來簡單聊聊你熟悉哪幾個(gè)吧?

          候選者:常見的工廠模式、代理模式、模板方法模式、責(zé)任鏈模式、單例模式、包裝設(shè)計(jì)模式、策略模式等都是有所了解的

          候選者:項(xiàng)目手寫代碼用得比較多的,一般就模板方法模式、責(zé)任鏈模式、策略模式、單例模式吧

          候選者:像工廠模式、代理模式這種,手寫倒是不多,但畢竟Java后端一般環(huán)境下都用Spring嘛,所以還是比較熟悉的。

          面試官要不你來手寫下單例模式唄?

          候選者:單例模式一般會(huì)有好幾種寫法

          候選者:餓漢式、簡單懶漢式(在方法聲明時(shí)加鎖)、DCL雙重檢驗(yàn)加鎖(進(jìn)階懶漢式)、靜態(tài)內(nèi)部類(優(yōu)雅懶漢式)、枚舉

          候選者:所謂「餓漢式」指的就是還沒被用到,就直接初始化了對象。所謂「懶漢式」指的就是等用到的時(shí)候,才進(jìn)行初始化

          候選者:那我就都寫寫吧,反正就那些代碼

          面試官:那你們用的哪種比較多?

          候選者:一般我們項(xiàng)目里用靜態(tài)內(nèi)部類的方式實(shí)現(xiàn)單例會(huì)比較多(如果沒有Spring的環(huán)境下),代碼簡潔易讀

          候選者:如果有Spring環(huán)境,那還是直接交由Spring容器管理會(huì)比較方便(Spring默認(rèn)就是單例的)

          候選:枚舉一般我們就用它來做「標(biāo)識(shí)」吧,而DCL這種方式也有同學(xué)會(huì)在項(xiàng)目里寫(在一些源碼里也能看到其身影),但總體太不利于閱讀和理解(:

          候選者:總的來說,用哪一種都可以的,關(guān)鍵我覺得要看團(tuán)隊(duì)的代碼風(fēng)格吧(保持一致就行),即便都用「餓漢式」也沒啥大的問題(現(xiàn)在內(nèi)存也沒那么稀缺,我認(rèn)為可讀性比較重要)

          面試官:嗯…

          面試官我看你在DCL的單例代碼上,寫了volatile修飾嘛?為什么呢?

          候選者:你不記得我們曾經(jīng)聊過volatile的了嘛?指令是有可能亂序執(zhí)行的(編譯器優(yōu)化導(dǎo)致亂序、CPU緩存架構(gòu)導(dǎo)致亂序、CPU原生重排導(dǎo)致亂序)

          候選者:在代碼new Object的時(shí)候,不是一條原子的指令,它會(huì)由幾個(gè)步驟組成,在這過程中,就可能會(huì)發(fā)生指令重排的問題,而volatile這個(gè)關(guān)鍵字就可以避免指令重排的發(fā)生。

          面試官那你說下你在項(xiàng)目里用到的設(shè)計(jì)模式吧?

          候選者:嗯,比如說,我這邊在處理請求的時(shí)候,會(huì)用到責(zé)任鏈模式進(jìn)行處理(減免if else 并且讓項(xiàng)目結(jié)構(gòu)更加清晰)

          候選者:在處理公共邏輯時(shí),會(huì)使用模板方法模式進(jìn)行抽象,具體不同的邏輯會(huì)由不同的實(shí)現(xiàn)類處理(每種消息發(fā)送前都需要經(jīng)過文案校驗(yàn),所以可以把文案校驗(yàn)的邏輯寫在抽象類上)

          候選者:代理模式手寫的機(jī)會(huì)比較少(因?yàn)轫?xiàng)目一般有Spring環(huán)境,直接用Spring 的AOP代理就好了)

          候選者:我之前使用過AOP把「監(jiān)控客戶端」封裝以「注解」的方式進(jìn)行使用(不用以硬編碼的方式來進(jìn)行監(jiān)控,只要有注解就行了)

          面試官那你能聊聊Spring常見的設(shè)計(jì)模式嘛?

          候選者:比如,Spring IOC容器可以理解為應(yīng)用了「工廠模式」(通過ApplicationContext或者BeanFactory去獲取對象)

          候選者:Spring的對象默認(rèn)都是單例的,所以肯定是用了「單例模式」(源碼里對單例的實(shí)現(xiàn)是用的DCL來實(shí)現(xiàn)單例)

          候選者:Spring AOP的底層原理就是用了「代理模式」,實(shí)現(xiàn)可能是JDK 動(dòng)態(tài)代理,也可能是CGLIB動(dòng)態(tài)代理

          候選者:Spring有很多地方都用了「模板方法模式」,比如事務(wù)管理器(AbstractPlatformTransactionManager),getTransaction定義了框架,其中很多都由子類實(shí)現(xiàn)

          候選者:Spring的事件驅(qū)動(dòng)模型用了「觀察者模式」,具體實(shí)現(xiàn)就是ApplicationContextEvent、ApplicationListener

          面試官:嗯,了解…

          瀏覽 61
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  女人一级做aa免费看 | 久久亚洲AV成人无码国产精品 | 狠狠色噜噜狠狠狠7777奇米 | 97超碰免费 | 五月天激情乱伦小说 |