Design 享元模式

基本介绍

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。

这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

特点:运用共享技术有效地支持大量细粒度的对象,用HashMap存储这些对象

案例图示

当大多数请求都是同一个结果,为每个请求生成一个实例的代价太高。

故只要请求的是同一个结果,我们就将已存在的实例进行返回。

举个生动的例子,在吃牛肉火锅时只要有牛肉火锅的锅底我们就将该锅底留下来,下一桌客人吃牛肉火锅的时候就用这个锅底煮。如果下一桌客人吃的是羊肉火锅,则新给他做一份,同时留下锅底。

如图所示:

image-20210413180639842

优缺点

优点:

  • 大大减少对象的创建
  • 降低系统的内存

缺点:

  • 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱

Python实现

用Python实现享元模式:

#! /usr/local/bin/python3
# -*- coding:utf-8 -*-

class HotPot(object):
    def __init__(self, name):
        self.name = name

    @property
    def info(self):
        return "这是一锅%s火锅" % self.name


class Flyweight(object):
    def __init__(self):
        # 已有锅底的存储
        self.bottom_of_the_pot = {}

    def get_bottom_of_the_pot(self, name):
        # 没有锅底,用新材料创建
        if not self.bottom_of_the_pot.get(name):
            print("没有%s火锅锅底,用原材料创建" % name)
            new_hot_pot = HotPot(name)
            self.bottom_of_the_pot[name] = new_hot_pot
            return new_hot_pot

        # 如果有锅底了,就返回锅底
        print("有%s火锅锅底,直接端出去" % name)
        return self.bottom_of_the_pot[name]


if __name__ == '__main__':
    hot_pot = Flyweight()
    beef_01 = hot_pot.get_bottom_of_the_pot("牛肉")
    beef_02 = hot_pot.get_bottom_of_the_pot("牛肉")
    beef_03 = hot_pot.get_bottom_of_the_pot("羊肉")
    beef_04 = hot_pot.get_bottom_of_the_pot("羊肉")

结果如下:

没有牛肉火锅锅底,用原材料创建
有牛肉火锅锅底,直接端出去
没有羊肉火锅锅底,用原材料创建
有羊肉火锅锅底,直接端出去

Golang实现

用Golang实现享元模式:

...
posted @ 2021-04-13 18:22  云崖君  阅读(52)  评论(0编辑  收藏  举报