2023-08-27|閱讀時間 ‧ 約 4 分鐘

Golang - Design Pattern #15: 享元模式 (Flyweight)

raw-image
🍃 有效管理和共享資源 🍃

大家有沒有遇到過這種情況:當應用程式使用過多資源,如記憶體或 CPU 時,整個系統的性能直線下降?😰 不得不說,資源的有效管理在軟體開發中真的超級重要!這就是享元模式 (Flyweight Pattern) 大顯身手的時候了!


享元模式 (Flyweight Pattern)

享元模式的主要目標是在記憶體中重複使用相似或完全相同的物件。這不僅僅是節省記憶體,也是為了提高效能。


Go Time

📒 文字編輯器

想像你正在編寫一個文字編輯器。每個字符可以具有字型、大小和顏色。但使用享元模式,我們可以把字型、大小和顏色的組合儲存在一個共享物件中。


type TextStyle struct {
Font string
Size int
Color string
}

var stylePool = map[string]*TextStyle{}

func GetStyle(font string, size int, color string) *TextStyle {
key := font + strconv.Itoa(size) + color
if style, exists := stylePool[key]; exists {
return style
}
style := &TextStyle{Font: font, Size: size, Color: color}
stylePool[key] = style
return style
}


🕹 遊戲中的粒子效果

在一個射擊遊戲中,可能有多種爆炸效果。使用享元模式,可以將不同的爆炸效果分解成顏色和形狀,並僅為每種獨特的組合創建一個物件。


type ExplosionEffect struct {
Color string
Shape string
}

var effectPool = map[string]*ExplosionEffect{}

func GetEffect(color string, shape string) *ExplosionEffect {
key := color + shape
if effect, exists := effectPool[key]; exists {
return effect
}
effect := &ExplosionEffect{Color: color, Shape: shape}
effectPool[key] = effect
return effect
}

這樣,儘管有數百個爆炸,但如果它們的效果是相似的,實際上只需要為每種獨特效果創建一個ExplosionEffect物件。


小結

享元模式不僅僅是節省記憶體。它還可以減少需要在某些操作中處理的物件數量,從而加速這些操作,特別是當物件是從資料庫或網絡獲取時。但請記住⚠,這可能會增加代碼的複雜性,因此要確保確實有這個需求再去使用它!

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.