享元模式
GitHub代码链接
享元模式(Flyweight Pattern)只要用于减少创建对象的数量,以减少内存占用和提高性能。
什么是享元模式
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新的对象。
解决了什么问题
在有大量对象时,又能会造成内存溢出。我们把其中共同的部分抽象出来,如果有相同的业务
请求,直接返回内存已有的对象,避免重复创建。
优点
- 大大减少对象的创建
缺点
- 提高了系统复杂度,需要分离出外部状态和内部状态。而且外部状态具有固有化性质,不应该
随着内部状态的变化而变化。
代码实现
我们创建5个圆的模型类,来画出20个不同位置的圆来演示。
1.1 实现圆形类
//Shape 模型接口
type Shape interface {
Draw()
}
//Circle 圆形类
type Circle struct {
X int
Y int
Radius int
Color string
}
//NewCircle 实例化圆形类
func NewCircle(color string) *Circle {
return &Circle{
Color: color,
}
}
//SetX 设置圆形类的x轴
func (c *Circle) SetX(x int) {
c.X = x
}
//SetY 设置圆形类的y轴
func (c *Circle) SetY(y int) {
c.Y = y
}
//SetRadius 设置圆形类的半径
func (c *Circle) SetRadius(radius int) {
c.Radius = radius
}
//Draw 圆形类的Draw方法,实现Shape接口
func (c *Circle) Draw() {
fmt.Printf("Circle Draw() [Color: %s, x: %d, y: %d, radius: %d] \n",
c.Color,
c.X,
c.Y,
c.Radius)
}
1.2 实现一个模型工厂
//ShapeFactory 模型工厂类,包含一个circle的map
type ShapeFactory struct {
circleMap map[string]Shape
}
//NewShapeFactory 实例化模型工厂类
func NewShapeFactory() *ShapeFactory {
return &ShapeFactory{
circleMap: make(map[string]Shape),
}
}
//GetCircle 获取一个圆形实例
//color: 需要获取实例的颜色
func (sf *ShapeFactory) GetCircle(color string) Shape {
circle := sf.circleMap[color]
if circle == nil {
circle = NewCircle(color)
sf.circleMap[color] = circle
fmt.Println("Creating circleof color: ", color)
}
return circle
}