首页
读书
网课

正文

享元模式从对象中剥离出不发生改变且多个实例需要的重复数据,独立出一个享元,使多个对象共享,从而节省内存以及减少对象数量。


flyweight.go

package flyweight


import "fmt"


type ImageFlyweightFactory struct {

    maps map[string]*ImageFlyweight

}


var imageFactory *ImageFlyweightFactory


func 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 file

    data := 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 flyweight


import "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()

    }

}



上一篇: 没有了
下一篇: 没有了
圣贤书院