設計模式常見面試知識點總結(Java版)

a724888發表於2019-10-18

設計模式

這篇總結主要是基於我設計模式系列的文章而形成的的。主要是把重要的知識點用自己的話說了一遍,可能會有一些錯誤,還望見諒和指點。謝謝

更多詳細內容可以到我的cdsn部落格上檢視: https://blog.csdn.net/a724888

最後,如果想要更好地完成這部分內容的學習,建議大家還是去看一下原文。

建立型模式

建立型模式 建立型模式的作用就是建立物件,說到建立一個物件,最熟悉的就是 new 一個物件,然後 set 相關屬性。但是,在很多場景下,我們需要給客戶端提供更加友好的建立物件的方式,尤其是那種我們定義了類,但是需要提供給其他開發者用的時候。

單例

1.  `單例模式保證全域性的單例類只有一個例項,這樣的話使用的時候直接獲取即可,比如資料庫的一個連線,Spring裡的bean,都可以是單例的。`
2.  
3.  `單例模式一般有5種寫法。`
4.  
5.  `第一種是餓漢模式,先把單例進行例項化,獲取的時候通過靜態方法直接獲取即可。缺點是類載入後就完成了類的例項化,浪費部分空間。`
6.  
7.  `第二種是飽漢模式,先把單例置為null,然後通過靜態方法獲取單例時再進行例項化,但是可能有多執行緒同時進行例項化,會出現併發問題。`
8.  
9.  `第三種是逐步改進的方法,一開始可以用synchronized關鍵字進行同步,但是開銷太大,而後改成使用volatile修飾單例,然後通過一次檢查判斷單例是否已初始化,如果未初始化就使用synchronized程式碼塊,再次檢查單例防止在這期間被初始化,而後才真正進行初始化。`
10.  
11.  `第四種是使用靜態內部類來實現,靜態內部類只在被使用的時候才進行初始化,所以在內部類中進行單例的例項化,只有用到的時候才會執行例項化程式碼。然後外部類再通過靜態方法返回靜態內部類的單例即可。`
12.  
13.  `第五種是列舉類,列舉類的底層實現其實也是內部類。列舉類確保每個類物件在全域性是唯一的。所以保證它是單例,這個方法是最簡單的。`

工廠模式

1.  `簡單工廠一般是用一個工廠建立多個類的例項。`
2.  
3.  `工廠模式一般是指一個工廠服務一個介面,為這個介面的實現類進行例項化`
4.  
5.  `抽象工廠模式是指一個工廠服務於一個產品族,一個產品族可能包含多個介面,介面又會包含多個實現類,通過一個工廠就可以把這些繫結在一起,非常方便。`

原型模式

1.  `一般通過一個例項進行克隆從而獲得更多同一原型的例項。使用例項的clone方法即可完成。`

建造者模式

1.  `建造者模式中有一個概念叫做鏈式呼叫,鏈式呼叫為一個類的例項化提供便利,一般提供系列的方法進行例項化,實際上就是將set方法改造一下,將原本返回為空的set方法改為返回this例項,從而實現鏈式呼叫。`
2.  
3.  `建造者模式在此基礎上加入了builder方法,提供給外部進行呼叫,同樣使用鏈式呼叫來完成引數注入。`

結構型模式

1.  `結構型模式`
2.  
3.  `前面建立型模式介紹了建立物件的一些設計模式。`
4.  
5.  `這節介紹的結構型模式旨在通過改變程式碼結構來達到解耦的目的,使得我們的程式碼容易維護和擴充套件。`

橋接模式

1.  `有點複雜。建議參考原文`

介面卡模式

1.  `介面卡模式用於將兩個不同的類進行適配。`
2.  
3.  `介面卡模式和代理模式的異同`
4.  
5.  ` 比較這兩種模式,其實是比較物件介面卡模式和代理模式,在程式碼結構上,`
6.  ` 它們很相似,都需要一個具體的實現類的例項。`
7.  ` 但是它們的目的不一樣,代理模式做的是增強原方法的活;`
8.  ` 介面卡做的是適配的活,為的是提供“把雞包裝成鴨,然後當做鴨來使用”,`
9.  ` 而雞和鴨它們之間原本沒有繼承關係。`
10.  
11.  ` 介面卡模式可以分為類介面卡,物件介面卡等。`
12.  
13.  ` 類介面卡通過繼承父類就可以把自己適配成父類了。`
14.  ` 而物件介面卡則需要把物件傳入另一個物件的構造方法中,以便進行包裝。`

享元模式

1.  `享元模式的核心在於享元工廠類,`
2.  
3.  `享元工廠類的作用在於提供一個用於儲存享元物件的享元池,`
4.  
5.  `使用者需要物件時,首先從享元池中獲取,`
6.  
7.  `如果享元池中不存在,則建立一個新的享元物件返回給使用者,`
8.  
9.  `在享元池中儲存該新增物件。`

代理模式

1.  `我們發現沒有,代理模式說白了就是做  “方法包裝”  或做  “方法增強”。`
2.  
3.  ` 在面向切面程式設計中,算了還是不要吹捧這個名詞了,在 AOP 中,`
4.  
5.  `其實就是動態代理的過程。比如  Spring  中,`
6.  `我們自己不定義代理類,但是  Spring  會幫我們動態來定義代理,`
7.  
8.  `然後把我們定義在  @Before、@After、@Around  中的程式碼邏輯動態新增到代理中。`

外觀模式

1.  `外觀模式一般封裝具體的實現細節,為使用者提供一個更加簡單的介面。`
2.  
3.  `通過一個方法呼叫就可以獲取需要的內容。`

組合模式

1.  `組合模式用於表示具有層次結構的資料,使得我們對單個物件和組合物件的訪問具有一致性。`
2.  
3.  `直接看一個例子吧,每個員工都有姓名、部門、薪水這些屬性,`
4.  
5.  `同時還有下屬員工集合(雖然可能集合為空),`
6.  `而下屬員工和自己的結構是一樣的,`
7.  
8.  `也有姓名、部門這些屬性,`
9.  `同時也有他們的下屬員工集合。`
10.  
11.  `class  Employee  {`
12.  `private  String name;`
13.  `private  String dept;`
14.  `private  int salary;`
15.  `private  List
 subordinates;  // 下屬`
16.  `}`

裝飾者模式

裝飾者

裝飾者模式把每個增強類都繼承最高階父類。然後需要功能增強時把類例項傳入增強類即可,然後增強類在使用時就可以增強原有類的功能了。

和代理模式不同的是,裝飾者模式每個裝飾類都繼承父類,並且可以進行多級封裝。

行為型模式

1.  `行為型模式`
2.  
3.  `行為型模式關注的是各個類之間的相互作用,將職責劃分清楚,使得我們的程式碼更加地清晰。`

策略模式

1.  `策略模式一般把一個策略作為一個類,並且在需要指定策略的時候傳入例項,於是我們可以在需要使用演算法的地方傳入指定演算法。`

命令模式

1.  `命令模式一般分為命令發起者,命令以及命令接受者三個角色。`
2.  
3.  `命令發起者在使用時需要注入命令例項。然後執行命令呼叫。`
4.  
5.  `命令呼叫實際上會呼叫命令接收者的方法進行實際呼叫。`
6.  
7.  `比如遙控器按鈕相當於一條命令,點選按鈕時命令執行,自動呼叫電視機提供的方法即可。`

模板方法模式

1.  `模板方法一般指提供了一個方法模板,並且其中有部分實現類和部分抽象類,並且規定了執行順序。`
2.  
3.  `實現類是模板提供好的方法。而抽象類則需要使用者自行實現。`
4.  
5.  `模板方法規定了一個模板中方法的執行順序,非常適合一些開發框架,於是模板方法也廣泛運用在開源框架中。`

觀察者模式和事件監聽機制

1.  `觀察者模式一般用於訂閱者和訊息釋出者之間的資料訂閱。`
2.  
3.  `一般分為觀察者和主題,觀察者訂閱主題,把例項註冊到主題維護的觀察者列表上。`
4.  
5.  `而主題更新資料時自動把資料推給觀察者或者通知觀察者資料已經更新。`
6.  
7.  `但是由於這樣的方式訊息推送耦合關係比較緊。並且很難在不開啟資料的情況下知道資料型別是什麼。`
8.  
9.  `知道後來為了使資料格式更加靈活,使用了事件和事件監聽器的模式,事件包裝的事件型別和事件資料,從主題和觀察者中解耦。`
10.  
11.  `主題當事件發生時,觸發該事件的所有監聽器,把該事件通過監聽器列表發給每個監聽器,監聽得到事件以後,首先根據自己支援處理的事件型別中找到對應的事件處理器,再用處理器處理對應事件。`

責任鏈模式

1.  `責任鏈通常需要先建立一個單向連結串列,然後呼叫方只需要呼叫頭部節點就可以了,後面會自動流轉下去。`
2.  
3.  `比如流程審批就是一個很好的例子,只要終端使用者提交申請,根據申請的內容資訊,自動建立一條責任鏈,然後就可以開始流轉了。`

微信公眾號

個人公眾號:黃小斜

黃小斜是跨考軟體工程的 985 碩士,自學 Java 兩年,拿到了 BAT 等近十家大廠 offer,從技術小白成長為阿里工程師。

作者專注於 JAVA 後端技術棧,熱衷於分享程式設計師乾貨、學習經驗、求職心得和程式人生,目前黃小斜的CSDN部落格有百萬+訪問量,知乎粉絲2W+,全網已有10W+讀者。

黃小斜是一個斜槓青年,堅持學習和寫作,相信終身學習的力量,希望和更多的程式設計師交朋友,一起進步和成長!

原創電子書:
關注公眾號【黃小斜】後回覆【原創電子書】即可領取我原創的電子書《菜鳥程式設計師修煉手冊:從技術小白到阿里巴巴Java工程師》

程式設計師3T技術學習資源: 一些程式設計師學習技術的資源大禮包,關注公眾號後,後臺回覆關鍵字 “資料” 即可免費無套路獲取。

考研複習資料:
計算機考研大禮包,都是我自己考研複習時用的一些複習資料,包括公共課和專業的複習視訊,這裡也推薦給大家,關注公眾號後,後臺回覆關鍵字 “考研” 即可免費獲取。

技術公眾號:Java技術江湖

如果大家想要實時關注我更新的文章以及分享的乾貨的話,可以關注我的公眾號【Java技術江湖】一位阿里 Java 工程師的技術小站,作者黃小斜,專注 Java 相關技術:SSM、SpringBoot、MySQL、分散式、中介軟體、叢集、Linux、網路、多執行緒,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!

Java工程師必備學習資源: 一些Java工程師常用學習資源,關注公眾號後,後臺回覆關鍵字 “Java” 即可免費無套路獲取。

我的公眾號

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69906029/viewspace-2660582/,如需轉載,請註明出處,否則將追究法律責任。

相關文章