設計模式這話題,我面試又被問了

Java3y發表於2021-11-30

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

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

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

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

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

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

原創不易!!求三連!!

相關文章