关于设计模式:设计模式享元Flyweight模式

模式定义

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

类图

利用场景

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

长处

如果零碎有大量相似的对象,能够节俭大量的内存及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"])
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理