12. Flyweight
關於 Flyweight 本篇將討論以下幾個問題
1. 關於 Flyweight
2. UML
3. 將 UML 轉為程式碼
4. 情境
測試環境:
OS:Windows 10
IDE:Visual Studio 2019
1. 關於 Flyweight
Use sharing to support large numbers of fine-grained objects efficiently.
by Gang of Four
Flyweight(享元)屬於結構型(Structural Patterns),當遇到系統中頻繁創建且只會異動狀態而不改變物件本身的小物件時,可藉由 Flyweight 來緩存物件,提供不同呼叫端重複使用,達到節省記憶體的目的。
優點:
缺點:
- 使用 Flyweight 的物件存於緩存中,就算沒使用也不會被 GC 回收
2. UML
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Class 間關聯:
- FlyweightFactory 可包含 Flyweight
- Client 關聯 FlyweightFactory & ConcreteFlyweight
- ConcreteFlyweight 繼承 Flyweight
Class:
- Client:呼叫端
- FlyweightFactory:以工廠方法實作享元工廠
- Flyweight:享元的抽象類別或介面
- ConcreteFlyweight:享元實作
3. 將 UML 轉為程式碼
享元介面
享元工廠
享元實作
- 建立享元工廠
factory
- 取得享元工廠中已建立實體
- 操作享元物件
執行結果
4. 情境
我們接到了一個提供線上商城客戶結帳時轉換匯率的需求
- 線上商城客戶很多,每個客戶都要 new 匯率 class 很吃記憶體
- 匯率固定提供部分貨幣類別,介面相同
貨幣類別 Enum
實作匯率工廠,並在建構子提供對應匯率
轉換介面
傳換實作
- 建立享元工廠
factory
- 取得享元物件(匯率轉換)
- 透過享元物件計算金額
執行結果
完整程式碼
GitHub:Structural_06_Flyweight
總結
Flyweight 屬於結構型,重點是重複使用而並非創建,所以創建的部分使用工廠來處理。 Flyweight 的物件是全部呼叫端共用,若是可修改內部狀態,則可能會造成 A 處理到一半時狀態被 B 修改,而造成 A 的結果與預期不同,這問題也許開發測試期間未必會發現,等到實際上線時才發現已經亂成一團了。
參考資料
- Design Patterns
- 大話設計模式
- dofactory
- Refactoring.Guru
新手上路,若有錯誤還請告知,謝謝