1. Creational Patterns
1.1 Singleton
1.2 Factory
1.3 Prototype
1.4 Builder
2. Structural Patterns
2.1 Adapter
2.2 Bridge
2.3 Composite
2.4 Decorator
2.5 Facade
2.6 Flyweight
2.7 Proxy
3. Behavioral Patterns
3.1 Chain of Responsibility
3.2 Command
3.3 Observer
3.4 State
4. Reference
主旨:
限制類別物件實體只能有一個,運用於在整個系統中,只需由一個物件來協調系統的全部操作,因此 Singleton 物件通常是全域的。
作法:
1. 將建構子宣告為 private,禁止外部直接建立物件實體。
2. 在類別內部建立一個靜態成員變數,儲存唯一的物件實體。
3. 提供一個靜態方法,讓外部可以透過該方法來取得唯一的物件實體。
主旨:
解決物件建立的問題,透過建立物件的工廠來創建新的物件實體。
作法:
1. 定義一個抽象類別,宣告一個 make() 方法,讓子類別實作該方法來建立新的物件實體。
2. 在需要建立物件的地方,透過 factory 調用 make() 方法來建立新的物件實體。
UML:
主旨:
解決物件建立的問題,透過複製現有物件來建立新的物件實體。
作法:
1. 定義一個抽象類別,宣告一個 clone() 方法,讓子類別實作該方法來複製物件。
2. 在需要建立物件的地方,先建立一個原型物件,然後透過 factory 調用 clone() 方法來複製出新的物件實體。
差異:
與原本的 Factory Method 模式不同,Prototype 模式是透過複製現有物件來建立新的物件實體,而 Factory Method 則是透過 make() 方法來建立新的物件實體。
UML:
主旨:
用於產生大型或較複雜的物件,透過逐步建構來建立新的物件實體。
作法:
1. 定義一個抽象類別,宣告一系列建構方法,讓子類別實作該方法來逐步建構物件。
2. 在需要建立物件的地方,透過 builder 調用建構方法來逐步建構出新的物件實體,這些建構方法會先檢查客戶端給予的參數是否合法,才開始建構。
3. 最後透過 builder 調用 getResult() 方法來取得建構完成的物件實體。
UML:
主旨:
將一個類別的介面轉換成客戶端所期望的另一個介面,使得原本因為介面不相容而無法一起工作的類別可以一起工作。
作法:
1. 定義一個 Adapter 類別,實作客戶端所期望的介面(繼承期望的類別),並在該類別內部持有一個 Adaptee 類別(聚合另一個類別)的物件實體。
2. 在 Adapter 類別中實作客戶端所期望的介面方法,並在該方法內部調用 Adaptee 類別的相應方法來完成功能。
UML:
主旨:
將方法與屬性分離的兩系列類別,藉由 Bridge 使它們連繫在一起。
作法:
1. 定義一個抽象類別(屬性系列類別),宣告一個指向方法系列類別的物件引用。
2. 在方法系列類別中,宣告並實現一系列方法。
3. 在屬性系列類別中調用方法系列類別的方法來完成功能。
UML:
主旨:
同一個抽象類別發展兩系列不同的子類別,其中一類變成容器,另一類變成元素。
作法:
1. 定義一個抽象類別,表示容器和元素的共同接口。
2. 定義具體的容器類別和元素類別,分別實現抽象類別的方法。
UML:
主旨:
在不修改原有物件結構的前提下,動態地給物件添加新的功能。
作法:
1. 定義一個抽象類別,表示被裝飾的物件。
2. 定義具體的裝飾器類別,繼承抽象類別並在其中添加新的功能。
3. 執行方式是以遞迴方式走到物件最原始型態,再逐步往回轉換成被裝飾後的物件型態。
UML:
主旨:
提供一個統一的介面,用來訪問一組複雜的子系統。
作法:
1. 定義一個 Facade 類別,提供簡單的介面來訪問複雜的子系統。
2. 在 Facade 類別中,整合並協調各個子系統的行為。
主旨:
Registry + Call by reference,解決相同物件重複創建,導致佔用大量記憶體的問題。
作法:
1. 定義一個 Flyweight 類別,負責管理共享物件的實例。
2. 在 Flyweight 類別中,使用 Registry 來儲存和管理共享物件的實例。
3. 在需要使用共享物件的地方,通過 Call by reference 的方式來獲取和使用這些物件。
UML:
主旨:
提供一個代理物件來控制對原始物件的訪問,例如指向實體的指標是否為空,否則新增實體。
作法:
1. 定義一個 Proxy 類別,持有對原始物件的引用。
2. 在 Proxy 類別中,實現與原始物件相同的接口。
3. 在需要時,Proxy 類別可以執行一些額外的操作,例如權限檢查、延遲初始化等。
UML:
主旨:
將 調用者(Invoker) 與 接收者(Receiver) 分開,依據職權/職責大小將 Receiver 物件串聯在一起。
作法:
1. 定義一連串的 Receiver 物件。
2. 依據執行期的條件,若請求不是當前 Receiver 的職責,則丟給下一個 Receiver 物件。
3. 架構實現方式和 Decorator 一樣,但執行方式是以單向線性方式執行。
UML:
主旨:
類似 Callback 的概念,主要有三個角色,分別是 調用者(Invoker)、命令(Command) 和 接收者(Receiver)。
Command 提供一個執行介面,用以執行 Receiver 的 Function,而 Receiver 由 Invoker 來決定。
作法:
1. 定義一個 Command 的抽象類別,再定義其衍生類別為樣板類別,用以儲存不同的 Receiver,以及要執行的 Function Pointer。
2. 通常情況下,Command 只擁有一個 Receiver 和 Function Pointer。
UML:
主旨:
用於一個 主體(Subject) 與 多個相依物件(Observers) 的架構,當 Subject 狀態改變時,Observers 會自動地更新。
作法:
1. 定義 Subject 與 Observer 物件類別。
2. 在 Subject 類別中定義 notify(),用於當 Subject 狀態改變時,通知所有 Observers 更新。
3. 在 Subject 類別中定義 attach() 和 detach(),用於儲存與解除 Observers 的相依性。
4. Observer 的職責是從 Subject 上註冊或解除註冊自己,在 Observer 的建構式參數中要求所附屬的 Subject,方便在解構式中自動地將自己從 Subject 解除註冊。
5. 在 Observer 類別中定義 update(),當接收到 Subject 的通知時,進行更新處理。
UML:
主旨:
用於當 主體(Subject) 狀態改變時,行為(Action) 也需要改變。每個狀態行為都是獨立的,在加入新狀態時,它不會影響已存在的狀態行為。
作法:
1. 定義一個 狀態(State) 抽象類別,且含有 handle() 純虛函式,其參數為 Subject 引數。
2. 定義 Subject 類別,聚合了 State 抽象類別。
3. 在 Subject 實現 execute() 函式,它會調用 state->handle()。
4. 在 Subject 實現 set_state() 函式,供 State 在 handle() 內更新 Subject 當前的狀態。
5. 定義 State 衍生類別,並實現 handle() 函式,此函式除了執行 Action 之外,也會新增新的 State 以替換掉 Subject 的當前 State。
UML:
Last updated: