12.Golang设计模式之享元模式

ShawnLee_123 · · 605 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

享元模式

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
}

上一篇

11.Golang设计模式之外观模式


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:ShawnLee_123

查看原文:12.Golang设计模式之享元模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

605 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传