Golang设计模式——16享元模式
享元模式
定义
运用共享技术有效的支持大量细颗粒度的对象
优点
- 它可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一份
- 享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享
缺点
- 享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化
- 为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长
场景
如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用,还有就是对象的大多数状态可以给外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式
代码
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观察者模式