23種設計模式學習總結 創建型設計模式 結構型設計模式 行爲型設計模式

創建型設計模式

主要解決對象的創建問題,封裝複雜的創建過程,解耦對象的創建代碼合使用代碼。

單例模式

單例模式用來創建全局唯一的對象。一個類只允許創建一個對象,這個類就是一個單例類。單例有幾種經典實現方式,分別爲:餓漢式、懶漢式、雙重檢測、靜態內部類、枚舉。

工廠模式

工廠模式包含簡單工廠、工廠方法、抽象工廠這三種細分模式。其中,前兩者比較常用、後一種並不常用。
工廠模式用來創建不同但是相關類型的對象(繼承同一父類或者接口的一組子類),由給定參數來決定創建哪種類型的對象。
實際上,如果創建對象邏輯不復雜,直接new就可以了,不需要使用工廠模式。當創建邏輯比較複雜時,考慮使用工廠模式,封裝對象的創建過程,將對象創建與使用相分離。

當對象創建邏輯比較簡單時,推薦使用簡單工廠模式,將多個對象創建邏輯放到一個類中。
當對象創建邏輯比較複雜時,推薦使用工廠方法模式,避免設計一個過於龐大的工廠類,將創建邏輯拆分得更細,每個對象的創建邏輯獨立到各自的工廠類中。

工廠模式的作用有下面4個:
1.封裝變化。將創建邏輯的變更對調用者透明。
2.代碼複用。創建代碼抽離到獨立的工廠類後可以複用。
3.隔離複雜性。封裝創建,調用者無需瞭解如何創建。
4.控制複雜度。將創建代碼抽離,讓原本函數或類職責更加單一。

建造者模式

建造者模式用來創建複雜對象,可以通過設置不同的可選參數,定製化地創建不同的對象。
如果有下面情況,可以考慮使用建造者模式:
1.如果類的屬性之間有一定的依賴關係或者約束條件;
2.如果希望創建不可變對象,也就是說,對象創建好之後,不能再修改內部的屬性值,這樣就不能在類中暴露set方法。

原型模式

如果對象的創建成本比較大,而同一個類的不同對象之間差別不大(大部分字段都相同)。這種情況下,我們可以利用已有對象(原型)進行拷貝的方法,來創建新對象,以達到節省創建時間的目的。
這種基於原型來創建對象的方式就叫做原型模式。

原型模式有兩種實現方法:深拷貝和淺拷貝。
淺拷貝只會複製類中的基本數據類型數據和引用對象的內存地址;
深拷貝得到的是一份完全獨立的對象。所以更加耗時,耗內存空間;

如果要拷貝的對象時不可變對象,淺拷貝共享不可變對象是沒問題的。但是對於可變對象來說,淺拷貝得到的對象和原始對象會共享部分數據,這有可能出現數據被修改的風險。
所以,一般比較推薦使用深拷貝。不要爲了一點性能提升使用淺拷貝。

結構型設計模式

結構型模式主要總結了一些類或對象組合在一起的經典結構,這些經典結構可以解決特定應用場景的問題。

代理模式

代理模式在不改變原始類接口的條件下,爲原始類定義一個代理類,主要目的是控制訪問,而非加強功能,這是他和裝飾器模式最大的不同。
一般情況下,我們讓代理類和原始類實現同樣的接口。但是,如果原始類沒有定義接口,我們可以讓代理類繼承原始類的方法來實現代理模式。

靜態代理需要針對每個類都創建一個代理類,增加了維護和開發成本。
我們可以使用動態代理:不事先爲每個原始類編寫代理類,而是在運行的時候動態地創建原始類對應的代理類,然後在系統中用代理類替換掉原始類。

代理模式常用於開發一些非功能性需求,比如監控、統計、鑑權、限流、事務、冪等、日誌。
我們可以將這些附加功能與業務功能解耦,放到代理類統一處理。

裝飾器模式

裝飾器模式主要解決繼承關係過於複雜的問題,通過組合來替代繼承,給原始類添加增強功能。這也是判斷是否該用裝飾器模式的一個重要依據。除此之外,裝飾器模式還有一個特點,就是可以對原始類嵌套使用多個裝飾器。爲了滿足這樣的需求,在設計的時候,裝飾器類需要跟原始類繼承相同的抽象類或者接口。

適配器模式

代理模式、裝飾器模式提供的都是和原始類相同的接口,而適配器提供跟原始類不同的接口。適配器模式是用來做適配的,它將不兼容的接口轉換爲可兼容的接口,讓原本由於接口不兼容而不能一起工作的類可以一起工作。
適配器模式有兩種實現方式:類適配器和對象適配器。其中,類適配器使用繼承關係來實現,對象適配器使用組合關係來實現。
適配器模式是一種事後補救策略,用來補救設計上的缺陷。

門面模式

門面模式通過封裝細粒度的接口,提供組合各個細粒度接口的高層次接口,來提高接口的易用性,或者解決性能、分佈式事務等問題。

組合模式

組合模式用來處理樹形結構數據。
組合模式,將一組對象組織成樹形結構,將單個對象和組合對象都看作樹中的節點,以統一處理邏輯,並且他利用樹形結構的特點,遞歸地處理每個子樹,依次簡化代碼實現。

享元模式

享元,顧名思義就是被共享的單元。
享元模式的意圖是複用對象,節省內存,前提是享元模式是不可變對象。
當一個系統中存在大量重複對象,我們可以利用享元模式,將對象在內存中只保留一份實例,共多處代碼引用,這樣可以減少內存中對象的數量,節省內存。
對於相似對象,我們也可以將這些對象中相同的部分(字段),提取出來設計成享元,讓這些大量相似對象引用這些享元。

行爲型設計模式

行爲型設計模式主要解決的是“類或對象之間的交互”問題。

觀察者模式

觀察者模式將觀察者和被觀察着解耦。
不同應用場景下,觀察者模式有着不同的實現方式:

  • 有同步阻塞、以及異步非阻塞方式;
  • 有進程內方式,也有跨進程方式;

同步阻塞主要是爲了代碼解耦;異步非阻塞除了能解耦代碼外,還能提高代碼的執行效率;
進程間的觀察者模式解耦更加徹底,一般基於消息隊列實現。

模板模式

模板方法模式在一個方法中定義一個算法骨架,並將某些步驟推遲到子類中實現。模板方法模式可以讓子類在不改變算法整體接口的情況下,重新定義算法中的某些步驟。
模板模式有兩大作用:服用和擴展。其中服用指的是,所有的子類可以複用父類中提供的模板方法的代碼。擴展指的是,框架通過模板模式提供功能擴展點,讓框架用戶可以在不修改框架源碼的情況下,基於擴展點定製化框架的功能。

策略模式

策略模式定義一組算法類,將每個算法分別封裝起來,讓他們可以互相替換。策略模式可以使算法的變化獨立於使用他們的客戶端。策略模式用來解耦策略的定義、創建、使用。

策略類的定義包含一個策略接口和一組實現這個接口的策略類。策略的創建由工廠類來完成,封裝創建細節。策略模式包含一組策略可選,客戶端代碼選擇使用哪個策略,有兩種確定方法:編譯時靜態確定和運行時動態確定。其中,後者是策略模式最典型的應用場景。

運用策略模式最常見的場景是來避免冗長的if-else或switch分支判斷。

職責鏈模式

在職責鏈模式中,多個處理器依次處理同一個請求。請求先經過A處理器處理,然後傳遞給B處理器,B處理器完成後再傳遞給C處理器,以此類推,形成一個鏈條。鏈條上的每個處理其各自承擔其處理職責。
職責鏈模式常用在框架開發中,用來實現過濾器、攔截器功能,讓框架使用者在不需要修改框架源碼的情況下,添加新的過濾、攔截功能。

迭代器模式

迭代器模式也叫做遊標模式,它用來遍歷集合對象。迭代器模式的主要作用是解耦容器代碼和遍歷代碼。

在通過迭代器遍歷集合元素時,增刪集合中的元素,可能會導致某個元素被重複遍歷或遍歷不到。解決這個問題有兩種辦法:
1.遍歷的時候不允許增刪元素;
2.增刪元素之後讓遍歷報錯。Java語言就是採用這種解決方案,fail-fast。

狀態模式

狀態模式一般用來實現狀態機,而狀態機常用在遊戲、工作流引擎等系統開發中。
狀態機又叫有限狀態機,它由3個部分組成:狀態、時間、動作。其中,事件也被稱爲轉移條件。事件觸發狀態的轉移及動作的執行。這裏,動作不是必須的,可以只轉移狀態。

狀態機有三種實現方式:
1.分支邏輯法。if-else或switch實現,直譯每個狀態轉移。適用於比較簡單的狀態機。
2.查表法。對於狀態很多、且轉移比較複雜的狀態機,通過二維數組來表示狀態轉移圖,能極大的提高代碼可讀性以及可維護性。
3.利用狀態模式。對於狀態不多、轉移也比較簡單,但事件觸發執行的動作包含的業務邏輯比較複雜的狀態機,首選這種方式。

訪問者模式

訪問者模式允許一個或多個操作應用到一組對象上,設計意圖是解耦操作和對象本身,保持類職責單一、滿足開閉原則以及應對代碼的複雜性。

備忘錄模式

備忘錄模式也叫做快照模式,具體來說就是在不違背封裝原則的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態,以便之後恢復對象爲先前的狀態。
這個模式的定義表達了兩部分內容:一部分是,存儲副本以便後期恢復;另一部分是,要在不違背封裝原則的前提下,進行對象的備份和恢復。

命令模式

命令模式用到最核心的實現手段,就是將函數封裝成對象。
在大部分編程語言中,函數式沒辦法作爲參數傳遞給其他函數的,也沒法賦值給變量。藉助命令模式,我們將函數封裝成對象,這樣就可以實現把函數像對象一樣使用。

命令模式的主要作用和應用場景,使用來控制命令的執行,比如,異步、延遲、排隊執行命令、撤銷重做命令、存儲命令、給命令記錄日誌等。

解釋器模式

解釋器模式爲某個語言定義它的語法表示,並定義一個解釋器用來處理這個語法。

解釋器模式的核心實現思想是,將語法解析的工作拆分到各個小類中,以此來避免大而全的解析類。一般的做法是,將語法規則拆分一些小的獨立單元,然後對每個單元進行解析,最終合併爲對整個語法規則的解析。

中介模式

中介模式的設計思想跟中間層很像,通過引入中介這個中間層,將一組對象之間的交互關係(或者說依賴關係)從多對多的網狀關係轉換爲一對多的星狀關係。原來一個對象需要跟N個對象交互,現在只需要跟一箇中介對象交互,從而最小化對象之間的交互關係,降低代碼複雜度。

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