什么是享元模式?
巧记:共享节约,皆大欢喜。
总结:享元模式是一种结构型设计模式,它通过共享技术有效地支持大量细粒度的对象。想象一个大家庭的餐桌,一顿饭需要的碗筷,如果每个人都自己带一套,那么需要的筷子和碗就会特别多,消耗的资源很大。但是如果大家都用公共的筷子和碗,就可以大大节省资源。这就是享元模式的原理。在计算机世界中,这种方式同样适用,尤其是在需要大量产生相同或相似对象的场景中,如线程池、连接池等,可以大大节约系统资源,提高效率。
享元模式是一种用于性能优化的模式,其核心思想是如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不需要为每一次使用都创建新的对象。
享元模式通过共享技术实现相同或相似对象的重用。 享元模式是结构型设计模式,它通过把内在状态(intrinsic state,相同部分)和外在状态(extrinsic state,不同部分)分离,通过共享创建实例,可以大幅度减少内存中对象的数量,从而达到节省内存的目的。 当一个程序使用了大量的对象,且大量的对象会导致很大的内存开销时,就可以考虑使用享元模式。
例子:围棋应用
假设我们是一个围棋应用的开发者,围棋中有黑白两色棋子,我们可以创建一个棋子的工厂,可以根据用户的需要给他们提供黑棋或者白棋,而无论多少用户,我们都只需要创建一个白棋和一个黑棋的实例就足够使用。
package mainimport "fmt"// Color Type
type Color stringconst (White Color = "white"Black = "black"
)// Piece Struct
type Piece struct {color Color
}// PieceFactory Struct
type PieceFactory struct {pieces map[Color]*Piece
}func (f *PieceFactory) GetPiece(color Color) *Piece {p, ok := f.pieces[color]if !ok {p = &Piece{color: color}f.pieces[color] = p}return p
}func NewPieceFactory() *PieceFactory {return &PieceFactory{pieces: make(map[Color]*Piece),}
}func main() {factory := NewPieceFactory()piece1 := factory.GetPiece(Black)fmt.Printf("Get piece: %v\n", piece1)piece2 := factory.GetPiece(White)fmt.Printf("Get piece: %v\n", piece2)piece3:= factory.GetPiece(Black)fmt.Printf("Get piece: %v\n", piece3)if piece1 == piece3 {fmt.Println("Same piece")} else {fmt.Println("Different piece")}
}
在这个例子中以看到,尽管用户调用了多次获取棋子的函数,但对同颜色的棋子,系统只创建了一个实例。
在享元模式中,有两种状态:
- 内部状态(Intrinsic State):在享元对象内部且不会随环境改变而改变的共享部分,例如我们棋盘游戏的黑白棋子之间的颜色。
- 外部状态(Extrinsic State):随环境改变而改变的、不可共享的状态,例如棋子的位置。
总结
总而言之,享元模式在如下场景中比较适用:
- 一个应用使用了大量的对象。
- 完全由于使用了大量的对象,造成很大的内存开销。
- 对象的大多数状态都可以变为外部状态。
- 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
- 程序设计得当,可以在运行时刻需要时新建对象。
如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~