Design 享元模式
基本介绍
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。
这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
特点:运用共享技术有效地支持大量细粒度的对象,用HashMap存储这些对象
案例图示
当大多数请求都是同一个结果,为每个请求生成一个实例的代价太高。
故只要请求的是同一个结果,我们就将已存在的实例进行返回。
举个生动的例子,在吃牛肉火锅时只要有牛肉火锅的锅底我们就将该锅底留下来,下一桌客人吃牛肉火锅的时候就用这个锅底煮。如果下一桌客人吃的是羊肉火锅,则新给他做一份,同时留下锅底。
如图所示:
优缺点
优点:
- 大大减少对象的创建
- 降低系统的内存
缺点:
- 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱
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实现享元模式:
...