設計模式是軟件工程中解決常見設計問題的可復用方案,是每一位軟件設計師提升代碼質量、可維護性與擴展性的必備工具箱。經典著作《設計模式:可復用面向對象軟件的基礎》歸納了23種核心模式,通常分為三大類:創建型、結構型和行為型。
一、創建型模式(5種)
關注對象創建的靈活性與解耦。
- 單例模式:確保一個類只有一個實例,并提供全局訪問點。常用于配置管理、線程池等。
- 工廠方法模式:定義一個創建對象的接口,但由子類決定實例化哪個類。將實例化延遲到子類。
- 抽象工廠模式:提供一個創建一系列相關或依賴對象的接口,而無需指定它們的具體類。用于產品族創建。
- 建造者模式:將一個復雜對象的構建與其表示分離,使得同樣的構建過程可以創建不同的表示。適用于構造復雜、步驟多的對象。
- 原型模式:通過復制現有對象(原型)來創建新對象,而非通過新建類。適用于創建成本較高的對象。
二、結構型模式(7種)
關注類和對象的組合,形成更大、更靈活的結構。
- 適配器模式:將一個類的接口轉換成客戶期望的另一個接口。使原本接口不兼容的類可以一起工作。
- 橋接模式:將抽象部分與其實現部分分離,使它們都可以獨立地變化。用于多維度變化。
- 組合模式:將對象組合成樹形結構以表示“部分-整體”的層次結構,使得客戶對單個對象和組合對象的使用具有一致性。
- 裝飾器模式:動態地給一個對象添加一些額外的職責。提供比繼承更靈活的擴展功能方式。
- 外觀模式:為子系統中的一組接口提供一個一致的、簡化了的界面(高層接口),降低子系統間的耦合。
- 享元模式:運用共享技術有效地支持大量細粒度對象的復用。減少內存消耗,常用于池技術。
- 代理模式:為其他對象提供一個代理或占位符以控制對這個對象的訪問。常見形式有遠程代理、虛擬代理、保護代理等。
三、行為型模式(11種)
關注對象間職責分配與通信。
- 責任鏈模式:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合。將這些對象連成一條鏈,并沿著鏈傳遞請求。
- 命令模式:將請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化,支持請求的排隊、記錄、撤銷等操作。
- 解釋器模式:給定一個語言,定義它的文法的一種表示,并定義一個解釋器,用來解釋語言中的句子。適用于特定領域語言。
- 迭代器模式:提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露其內部表示。
- 中介者模式:用一個中介對象來封裝一系列的對象交互,使各對象不需要顯式地相互引用,從而使其耦合松散。
- 備忘錄模式:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,以便以后可將該對象恢復到原先保存的狀態。
- 觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。
- 狀態模式:允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。
- 策略模式:定義一系列算法,將它們一個個封裝起來,并使它們可以相互替換,使得算法可以獨立于使用它的客戶而變化。
- 模板方法模式:定義一個操作中的算法骨架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
- 訪問者模式:表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
與應用指南
掌握這23種模式并非要求死記硬背,關鍵在于理解其背后的設計原則:如開閉原則、依賴倒置、組合優于繼承等。在實際軟件設計與制作中,應避免為用模式而用模式,而應識別出代碼中的“壞味道”(如緊耦合、難以擴展),再選擇合適模式進行重構。初學者應從最常用的模式(如工廠、單例、觀察者、策略、裝飾器)入手,在實踐中體會其精妙,逐步構建起自己的設計模式知識體系,最終達到靈活、恰當地運用模式,設計出優雅、健壯的軟件架構。