设计模式--享元(Flyweight)模式

72 阅读1分钟

模式定义

运用共享技术有效地支持大量细粒度的对象

类图

在这里插入图片描述

应用场景

如果系统有大量类似的对象,可以使用享元模式

优点

如果系统有大量类似的对象,可以节省大量的内存及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"])
}