全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang实现享元模式_共享对象以节省内存

享元模式在Go中通过结构体封装内在状态、客户端传入外在状态实现共享;使用sync.Map工厂缓存不可变享元指针,避免复制,确保高效复用。

享元模式的核心是“共享不变的部分,分离可变的部分”,在 Go 中没有传统面向对象的继承体系,但通过结构体、接口和指针,完全可以高效实现享元模式——关键是把**内在状态(intrinsic state)封装为共享对象,外在状态(extrinsic state)由客户端管理并传入操作中**。

设计共享的享元对象(Flyweight)

享元对象应是轻量、不可变(或仅含只读字段),通常用结构体定义,并避免持有外部依赖。例如,渲染不同颜色和位置的圆点时,颜色可共享,坐标则由调用方传入:

type CircleFlyweight struct {
    Color string // 内在状态:共享、不可变
}

func (c *CircleFlyweight) Draw(x, y float64) {
    fmt.Printf("Drawing a %s circle at (%.1f, %.1f)\n", c.Color, x, y)
}

构建享元工厂(FlyweightFactory)缓存实例

用 sync.Map 或 map + sync.RWMutex 管理已创建的享元,确保相同内在状态只生成一次。推荐使用 sync.Map 提升并发安全性和性能:

type FlyweightFactory struct {
    cache sync.Map // key: string (e.g., "red"), value: *CircleFlyweight
}

func (f *FlyweightFactory) Get(color string) *CircleFlyweight {
    if val, ok := f.cache.Load(color); ok {
        return val.(*CircleFlyweight)
    }
    fw := &CircleFlyweight{Color: color}
    f.cache.Store(color, fw)
    return fw
}

客户端按需获取并传入外在状态

客户端不直接 new 享元,而是向工厂索取;每次调用方法时,显式传入变化的数据(如位置、尺寸)。这样内存中只有一个 "blue" 实例,却能绘制成百上千个蓝色圆点:

factory := &FlyweightFactory{}
blue := factory.Get("blue")
red := factory.Get("red")

// 复用同一 blue 实例,仅改变坐标
blue.Draw(10.0, 20.0)
blue.Draw(15.0, 25.0)
blue.Draw(30.0, 40.0)

red.Draw(5.0, 5.0)

注意值类型与指针语义,避免意外复制

享元必须以指针形式传递和存储,否则每次赋值都会复制结构体,失去共享意义。同时,确保内在状态字段不被外部修改(Go 中无 private,靠约定+文档约束):

  • 始终用 *CircleFlyweight 而非 CircleFlyweight 做参数和返回值
  • 工厂的 cache 存储指针,客户端持有的也是指针
  • 若需更高安全性,可将结构体字段设为 unexported,并提供只读 getter 方法


# go  # golang  # win  # red  # 面向对象  # 封装  # 结构体  # 指针  # 继承  # 接口  # 值类型  # private  # map  # 并发  # 对象  # 客户端  # 复用  # 圆点  # 成百上千  # 设为  # 推荐使用  # 更高  # 只有一个  # 不被  # 可将 


相关文章: 如何配置支付宝与微信支付功能?  如何在阿里云ECS服务器部署织梦CMS网站?  Android滚轮选择时间控件使用详解  宝塔建站教程:一键部署配置流程与SEO优化实战指南  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  如何快速打造个性化非模板自助建站?  ui设计制作网站有哪些,手机UI设计网址吗?  建站之星伪静态规则如何设置?  在线制作视频网站免费,都有哪些好的动漫网站?  网站制作报价单模板图片,小松挖机官方网站报价?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  大连网站设计制作招聘信息,大连投诉网站有哪些?  建站VPS选购需注意哪些关键参数?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  平台云上自主建站:模板化设计与智能工具打造高效网站  长沙做网站要多少钱,长沙国安网络怎么样?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  制作公司内部网站有哪些,内网如何建网站?  如何快速生成ASP一键建站模板并优化安全性?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  建站之星安装需要哪些步骤及注意事项?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  香港网站服务器数量如何影响SEO优化效果?  宝塔建站助手安装配置与建站模板使用全流程解析  小程序网站制作需要准备什么资料,如何制作小程序?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  建站主机无法访问?如何排查域名与服务器问题  已有域名能否直接搭建网站?  如何通过智能用户系统一键生成高效建站方案?  网站制作话术技巧,网站推广做的好怎么话术?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  北京专业网站制作设计师招聘,北京白云观官方网站?  如何快速搭建虚拟主机网站?新手必看指南  ,想在网上投简历,哪几个网站比较好?  如何获取开源自助建站系统免费下载链接?  建站之星免费版是否永久可用?  如何通过VPS搭建网站快速盈利?  建站之星展会模版如何一键下载生成?  建站之星代理如何获取技术支持?  海南网站制作公司有哪些,海口网是哪家的?  如何快速搭建自助建站会员专属系统? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。