HOME ABOUT CONTACT

知識 - Design Pattern 學習筆記

Rain June 2, 2026
Outline

1. Creational Patterns

2. Structural Patterns

3. Behavioral Patterns

4. Reference

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. 定義具體的裝飾器類別,繼承抽象類別並在其中添加新的功能。

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

/* 待補充 */

Reference top

Last updated: