HOME ABOUT CONTACT

1. Creational Patternstop

1.1 Singleton

主旨:
限制類別物件實體只能有一個,運用於在整個系統中,只需由一個物件來協調系統的全部操作,因此 Singleton 物件通常是全域的。

作法:
1. 將建構子宣告為 private,禁止外部直接建立物件實體。
2. 在類別內部建立一個靜態成員變數,儲存唯一的物件實體。
3. 提供一個靜態方法,讓外部可以透過該方法來取得唯一的物件實體。

1.2 Factory

主旨:
解決物件建立的問題,透過建立物件的工廠來創建新的物件實體。

作法:
1. 定義一個抽象類別,宣告一個 make() 方法,讓子類別實作該方法來建立新的物件實體。
2. 在需要建立物件的地方,透過 factory 調用 make() 方法來建立新的物件實體。

UML:

1.3 Prototype

主旨:
解決物件建立的問題,透過複製現有物件來建立新的物件實體。

作法:
1. 定義一個抽象類別,宣告一個 clone() 方法,讓子類別實作該方法來複製物件。
2. 在需要建立物件的地方,先建立一個原型物件,然後透過 factory 調用 clone() 方法來複製出新的物件實體。

差異:
與原本的 Factory Method 模式不同,Prototype 模式是透過複製現有物件來建立新的物件實體,而 Factory Method 則是透過 make() 方法來建立新的物件實體。 UML:

1.4 Builder

主旨:
用於產生大型或較複雜的物件,透過逐步建構來建立新的物件實體。

作法:
1. 定義一個抽象類別,宣告一系列建構方法,讓子類別實作該方法來逐步建構物件。
2. 在需要建立物件的地方,透過 builder 調用建構方法來逐步建構出新的物件實體,這些建構方法會先檢查客戶端給予的參數是否合法,才開始建構。
3. 最後透過 builder 調用 getResult() 方法來取得建構完成的物件實體。

UML:

2. Structural Patternstop

2.1 Adapter

主旨:
將一個類別的介面轉換成客戶端所期望的另一個介面,使得原本因為介面不相容而無法一起工作的類別可以一起工作。

作法:
1. 定義一個 Adapter 類別,實作客戶端所期望的介面(繼承期望的類別),並在該類別內部持有一個 Adaptee 類別(聚合另一個類別)的物件實體。
2. 在 Adapter 類別中實作客戶端所期望的介面方法,並在該方法內部調用 Adaptee 類別的相應方法來完成功能。

UML:

2.2 Bridge

主旨:
將方法與屬性分離的兩系列類別,藉由 Bridge 使它們連繫在一起。

作法:
1. 定義一個抽象類別(屬性系列類別),宣告一個指向方法系列類別的物件引用。
2. 在方法系列類別中,宣告並實現一系列方法。
3. 在屬性系列類別中調用方法系列類別的方法來完成功能。

UML:

2.3 Composite

主旨:
同一個抽象類別發展兩系列不同的子類別,其中一類變成容器,另一類變成元素。

作法:
1. 定義一個抽象類別,表示容器和元素的共同接口。
2. 定義具體的容器類別和元素類別,分別實現抽象類別的方法。

UML:

2.4 Decorator

主旨:
在不修改原有物件結構的前提下,動態地給物件添加新的功能。

作法:
1. 定義一個抽象類別,表示被裝飾的物件。
2. 定義具體的裝飾器類別,繼承抽象類別並在其中添加新的功能。
3. 執行方式是以遞迴方式走到物件最原始型態,再逐步往回轉換成被裝飾後的物件型態。

UML:

2.5 Facade

主旨:
提供一個統一的介面,用來訪問一組複雜的子系統。

作法:
1. 定義一個 Facade 類別,提供簡單的介面來訪問複雜的子系統。
2. 在 Facade 類別中,整合並協調各個子系統的行為。

2.6 Flyweight

主旨:
Registry + Call by reference,解決相同物件重複創建,導致佔用大量記憶體的問題。

作法:
1. 定義一個 Flyweight 類別,負責管理共享物件的實例。
2. 在 Flyweight 類別中,使用 Registry 來儲存和管理共享物件的實例。
3. 在需要使用共享物件的地方,通過 Call by reference 的方式來獲取和使用這些物件。

UML:

2.7 Proxy

主旨:
提供一個代理物件來控制對原始物件的訪問,例如指向實體的指標是否為空,否則新增實體。

作法:
1. 定義一個 Proxy 類別,持有對原始物件的引用。
2. 在 Proxy 類別中,實現與原始物件相同的接口。
3. 在需要時,Proxy 類別可以執行一些額外的操作,例如權限檢查、延遲初始化等。

UML:

3. Behavioral Patternstop

3.1 Chain of Responsibility

主旨:
將 調用者(Invoker) 與 接收者(Receiver) 分開,依據職權/職責大小將 Receiver 物件串聯在一起。

作法:
1. 定義一連串的 Receiver 物件。
2. 依據執行期的條件,若請求不是當前 Receiver 的職責,則丟給下一個 Receiver 物件。
3. 架構實現方式和 Decorator 一樣,但執行方式是以單向線性方式執行。

UML:

3.2 Command

主旨:
類似 Callback 的概念,主要有三個角色,分別是 調用者(Invoker)、命令(Command) 和 接收者(Receiver)。
Command 提供一個執行介面,用以執行 Receiver 的 Function,而 Receiver 由 Invoker 來決定。

作法:
1. 定義一個 Command 的抽象類別,再定義其衍生類別為樣板類別,用以儲存不同的 Receiver,以及要執行的 Function Pointer。
2. 通常情況下,Command 只擁有一個 Receiver 和 Function Pointer。

UML:

3.3 Observer

主旨:
用於一個 主體(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:

Reference top

Last updated: