forked from senghoo/golang-design-pattern
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
82 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
# 享元模式 | ||
|
||
享元模式从对象中剥离出不发生改变且多个实例需要的重复数据,独立出一个享元,使多个对象共享,从而节省内存以及减少对象数量。 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
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()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
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() | ||
} | ||
} |