创建文件ImageFlyWeight.go
package FlyWeight import "fmt" type ImageFlyWeight struct { data string } // 初始化 func NewImageFlyWeight(filename string) *ImageFlyWeight { data := fmt.Sprintf("image data %s", filename) return &ImageFlyWeight{data} } func (i *ImageFlyWeight) Data() string { return i.data }
创建文件ImageFlyWeightFactory.go
package FlyWeight var imgFlyFactory *ImageFlyWeightFactory type ImageFlyWeightFactory struct { maps map[string]*ImageFlyWeight } // 对象初始化,不会反复初始化 func GetImageFlyWeightFactory() *ImageFlyWeightFactory { if imgFlyFactory == nil { imgFlyFactory = &ImageFlyWeightFactory{make(map[string]*ImageFlyWeight)} } return imgFlyFactory } func (i *ImageFlyWeightFactory) Get(filename string) *ImageFlyWeight { image := i.maps[filename] // 取出,去掉重复 if image == nil { image = NewImageFlyWeight(filename) // 存储进入 i.maps[filename] = image } return image }
创建文件ImageViewer.go
package FlyWeight import "fmt" type ImageViewer struct { *ImageFlyWeight } func NewImageViewer(filename string) *ImageViewer { image := GetImageFlyWeightFactory().Get(filename) return &ImageViewer{image} } func (i *ImageViewer) Display() { fmt.Sprintf("Display %s\n", i.Data()) }
main.go
package main import ( "fmt" "ssp_api_go/test/design/FlyWeight" ) func main() { v1 := FlyWeight.NewImageViewer("1.jpg") v1.Display() v2 := FlyWeight.NewImageViewer("1.jpg") v2.Display() if v1.ImageFlyWeight == v2.ImageFlyWeight { fmt.Println("节约内存") } else { fmt.Println("浪费内存") } }