Golang设计模式——16享元模式

享元模式

定义

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

优点

  1. 它可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一份
  2. 享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享

缺点

  1. 享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化
  2. 为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长

场景

如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用,还有就是对象的大多数状态可以给外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式

代码

在这里插入图片描述

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
}

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

其他设计模式

设计模式Git源代码
00简单工厂模式
01工厂方法模式
02抽象工厂模式
03外观模式
04建造者模式
05桥接模式
06命令模式
07迭代器模式
08模板模式
09访问者模式
10备忘录模式
11责任链模式
12中介模式
13原型模式
14状态模式
15策略模式
16享元模式
17组合模式
18解释器模式
19单例模式
20适配器模式
21代理模式
22装饰器模式
23观察者模式

posted @ 2021-09-25 15:38  cheems~  阅读(34)  评论(0编辑  收藏  举报