享元模式从对象中剥离出不发生改变且多个实例需要的重复数据,独立出一个享元,使多个对象共享,从而节省内存以及减少对象数量。
flyweight.go
package flyweightimport "fmt"type ImageFlyweightFactory struct {maps map[string]*ImageFlyweight
}var imageFactory *ImageFlyweightFactoryfunc GetImageFlyweightFactory() *ImageFlyweightFactory {if imageFactory == nil {imageFactory = &ImageFlyweightFactory{maps: make(map[string]*ImageFlyweight),}}return imageFactory
}func (f *ImageFlyweightFactory) Get(filename string) *ImageFlyweight {image := f.maps[filename]if image == nil {image = NewImageFlyweight(filename)f.maps[filename] = image}return image
}type ImageFlyweight struct {data string
}func NewImageFlyweight(filename string) *ImageFlyweight {// Load image filedata := fmt.Sprintf("image data %s", filename)return &ImageFlyweight{data: data,}
}func (i *ImageFlyweight) Data() string {return i.data
}type ImageViewer struct {*ImageFlyweight
}func NewImageViewer(filename string) *ImageViewer {image := GetImageFlyweightFactory().Get(filename)return &ImageViewer{ImageFlyweight: image,}
}func (i *ImageViewer) Display() {fmt.Printf("Display: %s\n", i.Data())
}
flyweight_test.go
package flyweightimport "testing"func ExampleFlyweight() {viewer := NewImageViewer("image1.png")viewer.Display()// Output:// Display: image data image1.png
}func TestFlyweight(t *testing.T) {viewer1 := NewImageViewer("image1.png")viewer2 := NewImageViewer("image1.png")if viewer1.ImageFlyweight != viewer2.ImageFlyweight {t.Fail()}
}