描述
亨元模式最终目的是节省内存,方式是避免重复创建对象。好比咱们玩游戏,就拿英雄联盟来说吧,一局游戏你杀死那么多小兵,如果每个小兵都创建一个对象,那得创建多少个对象呀!!!
咱们继续拿椰奶的例子说事,如果现在有个柜台要展示10罐椰奶,椰奶的代言人随机。我们要是写代码的话,我们可能会创建十个椰奶对象,这样也没问题就是浪费内存。
亨元模式的解决办法是,创建一个对象,利用对象的展现方法,更换代言人。见下面的代码:
实践一下:
# @Time : 2022/7/13 13:04
# @File : FlayWeight.py
# @Software: PyCharm
import random
from enum import Enum
class MaterialsEnum(Enum):
Box = "box"
Iron = "iron"
class CoconutMilk:
storage = {}
def __init__(self, c_materials):
self.c_materials = c_materials
def __new__(cls, *args, **kwargs):
obj = cls.storage.get(kwargs['c_materials'])
if not obj:
obj = object.__new__(cls)
obj.c_materials = kwargs['c_materials']
cls.storage[obj.c_materials] = obj
print("==> 创建对象")
return obj
def render(self, spokesman):
msg = f"材质是: {self.c_materials} 代言人是: {spokesman} 对象池的个数: {len(self.storage)}"
print(msg)
return msg
if __name__ == "__main__":
spokes_mans = ["徐冬冬", "古力娜扎", "马尔扎哈", "龙泽啦啦"]
# 纸盒形式
for _ in range(5):
box_cm = CoconutMilk(c_materials="box")
box_cm.render(random.choice(spokes_mans))
# 纸盒形式
for _ in range(5):
iron_cm = CoconutMilk(c_materials="iron")
iron_cm.render(random.choice(spokes_mans))
运行结果
从上面的运行结果看出,我们展现了10罐椰奶,但是只创建了两个对象。