享元模式通过共享对象来减少内存使用和对象创建的次数,从而提高系统的性能。
实现步骤如下:
- 创建一个抽象类或接口 Flyweight,定义享元对象的基本操作方法。
- 创建具体的享元类 ConcreteFlyweight,实现 Flyweight 接口,表示具体的享元对象。
- 创建享元工厂类 FlyweightFactory,用于创建和管理享元对象,维护享元池中的对象。
- 进行客户端测试,通过享元工厂获取共享对象并执行操作。
下面是一个示例代码:
// 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 是相同的对象,这说明共享对象生效了。