享元模式在Go中通过结构体封装内在状态、客户端传入外在状态实现共享;使用sync.Map工厂缓存不可变享元指针,避免复制,确保高效复用。
享元模式的核心是“共享不变的部分,分离可变的部分”,在 Go 中没有传统面向对象的继承体系,但通过结构体、接口和指针,完全可以高效实现享元模式——关键是把**内在状态(intrinsic state)封装为共享对象,外在状态(extrinsic state)由客户端管理并传入操作中**。
享元对象应是轻量、不可变(或仅含只读字段),通常用结构体定义,并避免持有外部依赖。例如,渲染不同颜色和位置的圆点时,颜色可共享,坐标则由调用方传入:
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)
}
用 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,靠约定+文档约束):
# 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小时内与您取得联系。