享元模式(Flyweight Design Pattern)
享元模式主要用于减少创建对象的数量,以减少内存的占用并提升性能。它通过重用现有的同类对象,如果没有找到匹配的对象就创建新的对象。享元模式通常会使用一个享元工厂来负责维护享元池来存储具有相同内部状态的享元对象。
实际应用中享元模式注意用于缓存,客户端重复请求不必每次都去查询数据库或读取文件,而是直接返回内存中缓存的数据。另外一个常用的场景是数据库连接池。
代码示例
package flyweight
import (
"sync"
)
type Person struct {
Name string
}
type Cache struct {
cache sync.Map
}
func (c *Cache) Get(name string) *Person {
if p, ok := c.cache.Load(name); ok {
return p.(*Person)
}
p := &Person{Name: name}
c.cache.Store(name, p)
return p
}
调用:
cache := &Cache{}
p1 := cache.Get("zhangshan")
p2 := cache.Get("zhangshan")
p3 := cache.Get("zhangshan")
fmt.Printf("%p, %+v\n", p1, p1)
fmt.Printf("%p, %+v\n", p2, p2)
fmt.Printf("%p, %+v\n", p3, p3)
// Output:
// 0xc00004e530, &{Name:zhangshan}
// 0xc00004e530, &{Name:zhangshan}
// 0xc00004e530, &{Name:zhangshan}