一、簡介
所謂“享元”,顧名思義就是被共享的單元。享元模式的意圖是復(fù)用對象,節(jié)省內(nèi)存,前提是享元對象是不可變對象。
實現(xiàn):通過工廠模式,在工廠類中,通過一個Map或者List來緩存已經(jīng)創(chuàng)建好的享元對象,以達(dá)到復(fù)用的目的。把實例的共享狀態(tài)和不共享狀態(tài)分開。
二、UML類圖
三、案例
以下是畫圖器畫圓的場景,圓形只有黑色和紅色兩種,所以可以共享復(fù)用。文章來源:http://www.zghlxwxcb.cn/news/detail-715329.html
package main
import "fmt"
const (
BLACK = 0
RED = 1
)
type CircleUnit struct {
Color int
}
func NewCircleUnit(color int) CircleUnit {
return CircleUnit{Color: color}
}
type CircleUnitFactory struct {
CircleMap map[int]CircleUnit
}
func (cuf *CircleUnitFactory) Init() {
blackCircle := NewCircleUnit(BLACK)
redCircle := NewCircleUnit(RED)
cuf.CircleMap = make(map[int]CircleUnit)
cuf.CircleMap[blackCircle.Color] = blackCircle
cuf.CircleMap[redCircle.Color] = redCircle
}
func (cuf *CircleUnitFactory) GetCircleUnit(color int) (CircleUnit, error) {
cu, ok := cuf.CircleMap[color]
if !ok {
return cu, fmt.Errorf("color[%v] is not exist", color)
}
return cu, nil
}
type Circle struct {
ID int
CircleUnit CircleUnit
X int
Y int
}
func NewCircle(id int, circleUnit CircleUnit, x, y int) Circle {
circle := Circle{}
circle.ID = id
circle.CircleUnit = circleUnit
circle.X = x
circle.Y = y
return circle
}
type DrawingBoard struct {
CircleMap map[int]Circle
}
func (db *DrawingBoard) Init() {
db.CircleMap = make(map[int]Circle)
}
func (db *DrawingBoard) Draw(circle Circle) {
db.CircleMap[circle.ID] = circle
}
func (db *DrawingBoard) Show() {
for k, v := range db.CircleMap {
fmt.Printf("id: %v, color: %v, x: %v, y: %v\n", k, v.CircleUnit.Color, v.X, v.Y)
}
}
func main() {
circleUnitFactory := CircleUnitFactory{}
circleUnitFactory.Init()
drawingBoard := DrawingBoard{}
drawingBoard.Init()
black, _ := circleUnitFactory.GetCircleUnit(BLACK)
red, _ := circleUnitFactory.GetCircleUnit(RED)
drawingBoard.Draw(NewCircle(1, black, 1, 1))
drawingBoard.Draw(NewCircle(2, red, 2, 2))
drawingBoard.Draw(NewCircle(3, black, 3, 3))
drawingBoard.Show()
}
四、對比
享元模式VS單例、緩存、對象池:應(yīng)用單例模式是為了保證對象全局唯一。應(yīng)用享元模式是為了實現(xiàn)對象復(fù)用,節(jié)省內(nèi)存。緩存是為了提高訪問效率,而非復(fù)用。池化技術(shù)中的“復(fù)用”理解為“重復(fù)使用”,主要是為了節(jié)省時間。文章來源地址http://www.zghlxwxcb.cn/news/detail-715329.html
到了這里,關(guān)于【設(shè)計模式】第13節(jié):結(jié)構(gòu)型模式之“享元模式”的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!