模式定义

使用共享技术无效地反对大量细粒度的对象

类图

利用场景

如果零碎有大量相似的对象,能够应用享元模式

长处

如果零碎有大量相似的对象,能够节俭大量的内存及CPU资源

要点总结

要点总结

  • 如果零碎有解耦实现对象的代价问题,Flyweight次要解决面向对象的代价问题,个别不涉及面向对象的抽象性问题
  • Flyweight采纳对象共享的做法来升高零碎中对象的个数,从而升高细粒度对象给零碎带来的内存压力。在具体实现方面,要留神对象状态的解决
  • 对象的数量太大从而导致对象内存开销加大--什么样的数量才算大?这须要咱们认真的依据具体利用状况进行评估,而不能凭空臆断

Go语言代码实现

工程目录

flyweight.go

package Flyweighttype 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 Flyweightimport "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"])}