---
# System prepended metadata

title: Flyweight（蠅量模式）

---

# 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 物件（存放共通狀態的地方）為不可變