go设计模式之美-原型模式
1. 定义
由于反复创建大量重复对象会造成效率损失,原型模式利用已有原型对象进行复制拷贝的方式来创建新对象,已达到节省创建时间的目的
2. 需求
- 项目启动时需要先将游戏的道具配置先加载到内存中
- 每次更新游戏对象数据属性时,需要重新再次加载一遍
- 游戏道具对象的属性数据必须来自同一版本,不能一部分数据来自版本一,更新的一部分来自版本二,所以需要将每次更新的数据全部深拷贝到内存中
代码实现
package prototype
import (
"encoding/json"
)
type ItemList struct {
ItemId int
ItemType int
Count int64
}
// 利用序列化和反序列化实现深拷贝
func (i *ItemList) Clone() (itemList *ItemList) {
marshal, err := json.Marshal(i)
if err != nil {
panic(err)
}
err = json.Unmarshal(marshal, &itemList)
if err != nil {
panic(err)
}
return
}
// 游戏道具map对象
type GameObject map[int]*ItemList
func (gameMap GameObject)Clone(list []*ItemList) GameObject{
gameObject:=GameObject{}
for key,value:=range list{
gameObject[key]=value // 这里是浅拷贝,直接把list的地址给gameObject
}
// 替换掉需要更新的游戏道具,这里用的是深拷贝
for _,idList:=range gameMap{
gameObject[idList.ItemId]=idList.Clone()
}
return gameObject
}