Go 实现享元模式

35 min read

享元模式通过共享对象来减少内存使用和对象创建的次数,从而提高系统的性能。

实现步骤如下:

  1. 创建一个抽象类或接口 Flyweight,定义享元对象的基本操作方法。
  2. 创建具体的享元类 ConcreteFlyweight,实现 Flyweight 接口,表示具体的享元对象。
  3. 创建享元工厂类 FlyweightFactory,用于创建和管理享元对象,维护享元池中的对象。
  4. 进行客户端测试,通过享元工厂获取共享对象并执行操作。

下面是一个示例代码:

// Flyweight 接口
type Flyweight interface {
    Operation()
}

// ConcreteFlyweight 具体享元类
type ConcreteFlyweight struct {
    state string
}

func (f *ConcreteFlyweight) Operation() {
    fmt.Printf("ConcreteFlyweight: %v\n", f.state)
}

// FlyweightFactory 享元工厂类
type FlyweightFactory struct {
    flyweights map[string]Flyweight
}

func (ff *FlyweightFactory) GetFlyweight(key string) Flyweight {
    if flyweight, ok := ff.flyweights[key]; ok {
        return flyweight
    } else {
        flyweight := &ConcreteFlyweight{state: key}
        ff.flyweights[key] = flyweight
        return flyweight
    }
}

// Client 客户端
func Client() {
    factory := &FlyweightFactory{
        flyweights: make(map[string]Flyweight),
    }

    flyweight1 := factory.GetFlyweight("key1")
    flyweight1.Operation()

    flyweight2 := factory.GetFlyweight("key1")
    flyweight2.Operation()

    fmt.Printf("Are flyweight1 and flyweight2 the same object? %v\n", flyweight1 == flyweight2)
}

在客户端中,我们通过享元工厂获取共享对象,并执行操作。注意到获取到的 flyweight1 和 flyweight2 是相同的对象,这说明共享对象生效了。