iT邦幫忙

2021 iThome 鐵人賽

DAY 25
1
Software Development

Hey! Go Design Patterns系列 第 25

DAY 25:Flyweight Pattern,節省空間的好幫手

  • 分享至 

  • xImage
  •  

2023/04/05 更新: 為了避免本文章散落在不同網站,之後統一由部落格更新,再麻煩從部落格查看~

什麼是 Flyweight Pattern?

將可共用的物件共用以節省空間

問題情境

設計一個撲克牌遊戲,如果牌局在運行,每創建一個牌局就需要建立新的卡牌,這樣會很浪費記憶體,需要有方法解決此問題。

解決方式

(相關的 code 在Github - go-design-patterns)

設計一個可共用的物件pockerCards{},裡頭有著所有撲克牌,在用NewPockerGame()開啟每場牌局時,程式會設定卡牌的來源都來自pockerCards{}

package main

import "fmt"

var pockerCards = map[int]*Card{
	1: {
		Name:  "A",
		Color: "紅",
	},
	2: {
		Name:  "A",
		Color: "黑",
	},
	// 其他卡牌
}

type Card struct {
	Name  string
	Color string
}

type PockerGame struct {
	Cards map[int]*Card
}

func NewPockerGame() *PockerGame {
	board := &PockerGame{Cards: map[int]*Card{}}
	for id := range pockerCards {
		board.Cards[id] = pockerCards[id]
	}
	return board
}

func main() {
	game1 := NewPockerGame()
	game2 := NewPockerGame()
	fmt.Println(game1.Cards[1] == game2.Cards[1])
}

與 Singleton Pattern 的差異

兩者都有共用的概念,但有些許差異:

  • Singleton Pattern 在整個系統只會有一個物件
  • Flyweight Pattern 在整個系統可以有多個物件

上一篇
DAY 24:Composite Pattern,管理有層次的物件們
下一篇
DAY 26:Proxy Pattern,讓代理人操作實際的物件
系列文
Hey! Go Design Patterns30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言