模式定义
运用共享技术有效地支持大量细粒度的对象
类图
应用场景
如果系统有大量类似的对象,可以使用享元模式
优点
如果系统有大量类似的对象,可以节省大量的内存及CPU资源
要点总结
要点总结
- 如果系统有解耦实现对象的代价问题,Flyweight主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题
- Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理
- 对象的数量太大从而导致对象内存开销加大--什么样的数量才算大?这需要我们仔细的根据具体应用情况进行评估,而不能凭空臆断
Go语言代码实现
工程目录
flyweight.go
package Flyweight
type FlyWeight struct {
Name string
}
func NewFlyWeight (name string) *FlyWeight{
return &FlyWeight{Name: name}
}
type FlyWeightFactory struct {
pool map[string]*FlyWeight
}
func NewFlyWeightFactory() *FlyWeightFactory {
return &FlyWeightFactory{pool: make(map[string]*FlyWeight)}
}
func (f *FlyWeightFactory) GetFlyWeight (name string) *FlyWeight {
weight, ok := f.pool[name]
if !ok {
weight = NewFlyWeight(name)
f.pool[name] = weight
}
return weight
}
flyweight_test.go
package Flyweight
import "testing"
import "github.com/stretchr/testify/assert"
func TestFlyWeightFactory_GetFlyWeight(t *testing.T) {
factory := NewFlyWeightFactory()
hong := factory.GetFlyWeight("hong beauty")
xiang := factory.GetFlyWeight("xiang beauty")
assert.Len(t, factory.pool, 2)
assert.Equal(t, hong, factory.pool["hong beauty"])
assert.Equal(t, xiang, factory.pool["xiang beauty"])
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。