# Flyweight(蠅量模式) ## 如果一個類別實例可以用來提供許多虛擬實例,那就使用蠅量模式。 簡言之:**多個物件共享同份狀態** ### 情境: #### 五子棋遊戲 每個棋子都有標示位置的x與y以及顏色 ![](https://i.imgur.com/qofQ8eU.png) ##### 問題:每個棋子實例都記錄著自己的狀態,而導致棋子一多時程式執行緩慢(因為內存不夠) ##### 改善方法:只使用一個棋子實例,讓用戶端物件負責維護每個棋子的狀態 ![](https://i.imgur.com/IS1KDnK.jpg) --- ### 外在與內在狀態 #### 起初設計 ![](https://i.imgur.com/bamw3FI.png) #### 拆分 ![](https://i.imgur.com/i4aG327.png) #### 結果 ![](https://i.imgur.com/RI08ls6.png) --- ### 適用情境: 1. 生成大量相似的物件(導致內存耗盡) 2. 對象內含有可抽取且其他對象也共享的重複狀態 ### 好處: 1. 減少執行期的物件數量,節省記憶體 2. 將許多虛擬物件的狀態集中在一個位置 ### 壞處: 1. 類別內的每一個邏輯實例都沒辦法展現與別的實例不一樣的行為 ### Flyweight 與 Singleton的比較 1. Singleton只會有一個實體,Flyweight可以有多個 2. Singleton 物件的狀態為可變,而 Flyweight 物件(存放共通狀態的地方)為不可變