Flyweight Pattern,節省空間的好幫手

什麼是 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 在整個系統可以有多個物件
comments powered by Disqus