抽象工廠模式 為什麼要用抽象工廠模式? * 舉個實際應用的例子,一個顯示器電路板廠商,旗下的顯示器電路板種類有非液晶的和液晶的;這個時候,廠商建造兩個工廠,工廠A負責生產非液晶顯示器電路板,工廠B負責生產液晶顯示器電路板;工廠一直就這樣運行著。有一天,總經理髮現,直接生產顯示器的其餘部分也挺掙錢,所 ...
註:所有知識來源於《設計模式:可復用軟體面向對象的基礎》
1 什麼是設計模式
Christopher Alexander說過:“每一個模式描述了一個在我們周圍不斷重覆發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重覆勞動。”
一般而言,一個模式有四個基本要素:
模式名(pattern name) 用一兩個此來描述模式的問題、解決方案和效果。
問題(problem) 描述了應該在何時使用模式,解釋了設計問題和問題存在的前因後果,可能描述了特定的設計問題,也可能描述了導致不靈活設計的類或對象結構,有時候問題部分會包括使用模式必須滿足的一系列先決條件。
解決方案(solution) 描述了設計的組成部分、他們之間的相互關係及各自的職責和協作方式。不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合來解決這個問題。
效果(consequence) 描述了模式應用的效果及使用模式應權衡的問題。
設計模式命名、抽象和確定了一個通用設計結構的主要方面,這些設計結構能被用來構造可復用的面向對象設計。設計模式確定了所包含的類和實例,它們的角色、協作方式以及職責分配。每一個設計模式都集中於一個特定的面向對象設計問題或設計要點,描述了什麼時候使用它,在另一些設計約束條件下是否還能使用,以及使用的效果和如何取捨。
2 描述設計模式
使用統一的格式描述設計模式有助於學習、比較和使用設計模式。
模式名和分類 模式名簡潔地描述了模式地本質,分類主要是使用該模式的目的。
意圖 意圖是回答“設計模式是做什麼的?它的基本原理和意圖是什麼?它解決的是什麼樣的特定設計問題?”
別名 模式的其他名稱
動機 用以說明一個設計問題以及如何用模式中的類、對象來解決該問題的特定情景。
適用性 什麼情況下可以使用該設計模式?該模式可用來改進哪些不良設計?怎麼識別這些情況?
結構 原書是採用基於對象建模技術(OMT)[RBP+91]的表示法對模式中的類進行圖形描述,使用了交互圖[JCJO92,BOO94],我會採用統一建模語言UML來進行描述。
參與者 指設計模式中的類和/或對象以及他們各自的職責。
協作 模式的參與者怎樣協作以實現他們的職責。
效果 模式怎樣支持它的目標?使用模式的效果和所需做的權衡是什麼?系統結構的哪些方面可以獨立改變?
實現 實現模式時需要知道的一些提示、技術要點及應避免的缺陷,以及是否存在某些特定於實現語言的問題。
代碼示例 使用具體的編程語言進行實現,原文采用C++或Smalltalk,我會採用Java來進行實現。
已知應用 實際系統中發現的模式的例子。
相關模式 與這個模式緊密相關的模式有哪些?期間重要的不同之處是什麼?這個模式應與哪些其他模式一起使用?
3 23種設計模式一句話介紹
表1 設計模式的分類
目的 | ||||
---|---|---|---|---|
創建型 | 結構型 | 行為型 | ||
範圍 | 類 | Factory Method | Adapter | Interpreter Template Method |
對象 | Abstract Factory Builder Prototype Singleton |
Adapter Bridge Composite Decorator Facade Flyweight Proxy |
Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor |
圖1 設計模式之間的關係
3.1 創建型
Abstract Factory 抽象工廠模式,提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。
Builder 建造者模式,將一個複雜對象的構建與它的實現部分分離,使它們都可以獨立地變化。
Factory Method 工廠方法模式,定義一個用於創建對象的介面,讓子類決定將哪一個類實例化,是一個類的實例化推遲到其子類。
Prototype 原型模式,用原型實例指定創建對象的種類,並且通過拷貝這個原型來創建新的對象。
Singleton 單例模式,保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
3.2 結構型
Adapter 適配器模式,將一個類的介面轉換成客戶希望的另一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
Bridge 橋接模式,將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
Composite 組合模式,將對象組合成樹形結構以表示“部分-整體”的層次結構,是的客戶對單個對象和組合對象的使用具有一致性。
Decorator 裝飾器模式,動態地給一個對象添加一些額外的職責,就擴展而言,Decorator比生成子類方式更為靈活。
Facade 外觀模式,為子系統中的一組介面提供一個一致的界面,定義了一個高層介面,這個介面使得這一子系統更容易使用。
Flyweight 享元模式,運用共用技術有效地支持大量細粒度的對象。
Proxy 代理模式,為其他對象提供一個代理以控制對這個對象的訪問。
3.3 行為型
Chain of Responsibility 職責鏈模式,接觸請求的發送者和接收者之間的耦合,是多個對象都有機會處理這個請求,將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它。
Command 命令模式,將一個請求封裝為一個對象,從而使你可用不同的請求對客戶端進行參數化,對請求排隊或記錄請求日誌,以支持可取消的操作。
Interpreter 解釋器模式,給定一個語言,定義它的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。
Iterator 迭代器模式,提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內部表示。
Mediator 中介者模式,用一個中介對象來封裝一些列的對象交互,中介者使各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
Memento 備忘錄模式,在不破壞封裝性的前提下捕獲一個對象的內部狀態,併在該對象之外保存這個狀態,這樣以後就可以將該對象恢復到保存的狀態。
Observer 觀察者模式,定義對象間的一種一對多的依賴關係,以便當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並自動刷新。
State 狀態模式,允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它所屬的類。
Strategy 策略模式,定義一系列的演算法,把它們一個個封裝起來,並且使它們可相互替換,本模式使得演算法的變化可獨立於使用它的客戶。
Template Method 模板方法模式,定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method 使得子類不改變一個演算法的結構即可重定義該演算法的某些特定的步驟。
Visitor 訪問者模式,表示一個作用於某對象結構中的各元素的操作,使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。