16種python設計模式使用場景、特點簡述
++設計模式是在已有的方案之上發現更好的方案,而不是全新發明,不要為了強迫自己使用已有的設計模式而限制了你的創造力++
建立型模式
處理物件建立相關問題
1 工廠模式
1.1 工廠方法
==一個函式==,對不同的輸入引數返回不同的物件
- 集中在一個地方建立物件,方便對物件的追蹤
- 解耦建立物件-使用物件
- 在必要時才建立新物件,提高效能和記憶體使用率
1.2 抽象工廠
同屬於==單個類==的許多工廠方法用於建立==一系列==種類的相關物件,每個工廠方法負責生產不同種類的物件
2 建造者模式
- 想要建立一個由多個部分構成的物件,而且它的構成需要一步接一步完成,只有每個部分都建立好,這個物件才是完整的。
- 當這個構造過程可以產生不同的表現,就可以試用建造者模式。
- 與工廠模式的區別:工廠模式以單個步驟建立物件,建造者模式以多個步驟建立物件;工廠模式會立刻返回一個建立好的物件,建造者模式僅在需要時才顯示地請求指揮者返回最終的物件。
與工廠模式相比,以下情況建造者模式更好:
- 建立一個複雜物件(物件由多個部分構成,且物件的建立要經過多個不同的步驟,這些步驟也許還要遵從特定的順序)
- 要求一個物件能有不同的表現,且物件的構建與表現解耦
- 想要在某個時間點建立物件,但是在稍後的時間點再訪問
3 原型模式
用於建立物件的完全副本
- copy.copy() 建立淺副本,副本依賴引用
- copy.deepcopy() 建立深副本,副本複製所有東西,此時需要關注因物件克隆而引入的資源耗用問題。
機構型模式
4 介面卡模式
- 處理一個系統中的不同實體之間的關係,關注的是提供一種簡單的物件組合來創造新功能。
- 比如:使用該模式讓多個介面相容。
5 修飾器模式
- 與繼承相比,通常應該優選組合,因為繼承會使程式碼更難複用。
- python裝飾器比修飾器模式能做的更多,其中之一就是實現修飾器模式。
- 比如:使用裝飾器來擴充套件一個物件的行為
6 外觀模式
- 有助於隱藏系統內部的複雜性,並通過一個簡易的介面向客戶端暴露必要的部分。
- 外觀封裝內部系統
7 享元模式
- 通常為相似物件引入資料共享來最小化記憶體使用,提示效能。
- 旨在優化效能和記憶體使用。
- 關注的是共享物件資料
- 一般來說,在應用需要建立大量的計算代價但共享許多屬性的物件時,可以使用享元模式,重點在於將不可變(可共享)的屬性與可變的屬性區別開
8 模型-檢視-控制器模式 MVC模式
關注點分離 SoC Separation of Concerns 原則
- 中心思想是:將一個應用切分成不同的部分,每個部分解決一個單獨的關注點
- 分層設計中的層次(資料訪問層,業務邏輯層,表示層等)即是關注點
模型、檢視、控制器
- 模型負責訪問資料,管理應用的狀態
- 檢視是模型的外在表現,檢視並非必須是圖形化的,文字輸出也可以
- 控制器是模型與檢視之間的連線
9 代理模式
在訪問某個物件之前執行一個或多個重要的操作,比如ORM是關係型資料庫的代理
四種代理模式如下:
- 遠端代理:代表一個活躍於遠端位置(例如遠端伺服器或雲服務)的物件
- 虛擬代理:講一個物件的初始化延遲到真正需要時使用
- 保護/防護代理:用於對處理敏感資訊的物件進行訪問控制
- 智慧/引用代理:通過新增幫助資訊(比如引用計數)來擴充套件一個物件的行為
行為模式
10 責任鏈模式
- 責任鏈模式用於讓多個物件來處理單個請求時,或者用於預先不知道應該由哪個物件來處理某個特性請求時。
- 傳送方可以直接訪問鏈中的首個節點。若首個節點不能處理請求,則轉發給下一個節點,直到請求被某個節點處理或者整個鏈遍歷結束
- 可以實現傳送發與多個接收方之間的解耦
原則:
- 存在一個物件鏈(連結串列,樹或者任何其他便捷的資料結構)
- 一開始將請求傳送給鏈中的第一個物件
- 物件決定其是否處理該請求
- 物件將請求轉發給下一個物件
- 重複該過程,指導達到鏈尾
11 命令模式
- 將一個操作封裝成一個物件
- 呼叫命令的物件與執行命令的物件解耦