go设计模式之美-原型模式

本文介绍了如何使用Go语言的原型模式优化游戏道具配置的加载和更新。通过序列化和反序列化实现深拷贝,确保每次更新数据时都能得到完整且独立的对象副本,避免了属性数据混合的问题。文章详细展示了代码实现,包括道具对象的深拷贝方法以及整个游戏道具map的深拷贝过程。
摘要由CSDN通过智能技术生成

go设计模式之美-原型模式

1. 定义

由于反复创建大量重复对象会造成效率损失,原型模式利用已有原型对象进行复制拷贝的方式来创建新对象,已达到节省创建时间的目的

image-20211010222834594

2. 需求
  1. 项目启动时需要先将游戏的道具配置先加载到内存中
  2. 每次更新游戏对象数据属性时,需要重新再次加载一遍
  3. 游戏道具对象的属性数据必须来自同一版本,不能一部分数据来自版本一,更新的一部分来自版本二,所以需要将每次更新的数据全部深拷贝到内存中
代码实现
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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值