享元模式核心是“共享+不可变+外部化”,即提取不变的内在状态复用,将变化的外在状态由调用方传入;Go中通过不可变结构体、sync.Pool管理与参数注入实现。

享元模式(Flyweight Pattern)本质是“共享+不可变+外部化”。它把对象中可共享的、不变的状态(内在状态)提取出来复用,而将依赖上下文的、变化的部分(外在状态)由调用方传入。在 Go 中,这通常体现为:一个轻量结构体(享元) + 一个对象池(sync.Pool 或自定义缓存) + 外部传参处理差异化逻辑。
不需要复杂框架,用原生特性就能高效落地:
假设多个服务需频繁格式化日志消息,共用相同的格式规则(前缀、分隔符、时区),但每条日志内容不同:
type LogFormatter struct {
prefix string
separator string
loc *time.Location // 内在状态:固定不变
}
func (f *LogFormatter) Format(msg string, ts time.Time) string {
return fmt.Sprintf("%s%s[%s]%s%s",
f.prefix, f.separator,
ts.In(f.loc).Format("15:04:05"),
f.separator, msg)
}
var formatterPool = sync.Pool{
New: func() interface{} {
return &LogFormatter{
prefix: "[APP]",
separator: " | ",
loc: time.UTC,
}
},
}
// 使用时:
f := formatterPool.Get().(*LogFormatter)
output := f.Format("user login", time.Now())
formatterPool.Put(f) // 归还,供下次复用
注意:Put 前确保享元未被并发修改,否则会破坏不可变性;若需并发安全,享元本身应完全无状态,或用只读字段 + 参数驱动。
立即学习“go语言免费学习笔记(深入)”;
享元在 Go 中不是银弹。适用场景很明确:
不适用的情况包括:对象天然唯一(如代表某次请求的 RequestCtx)、状态频繁变更、或复用收益远小于代码复杂度增加——这时 plain struct + sync.Pool 就够了,不必强行套享元术语。
基本上就这些。享元不是语法糖,而是对“复用边界”的一次主动设计。写清楚内在/外在,管住 mutability,池子自然就稳了。
以上就是如何使用Golang实现享元对象池_使用Flyweight Pattern复用资源的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号