又被面試官問設計模式了,我真的是

面試官我看你的簡歷寫着熟悉常見的設計模式,要不你來簡單聊聊你熟悉哪幾個吧?

候選者:常見的工廠模式、代理模式、模板方法模式、責任鏈模式、單例模式、包裝設計模式、策略模式等都是有所瞭解的

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

候選者:像工廠模式、代理模式這種,手寫倒是不多,但畢竟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面試,對線面試官系列持續更新中!

【對線面試官-移動端】系列 一週兩篇持續更新中!

【對線面試官-電腦端】系列 一週兩篇持續更新中!

原創不易!!求三連!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章