Python 设计模式 flyweight 享元模式

744 阅读1分钟

基本概念

解决大量细粒度对象引起的内存问题。
对细粒度的对象进行分析,拆分为内部状态和外部状态。
内部状态->可以共享的(不变的),对所有对象来说都是一致的的状态;
外部状态->每个对象各自个性化的状态。

实现代码

实现的方法 很多,个人比较喜欢下面这个,简单明了

# 使用装饰器,闭包实现内部状态统一
def flyweight(cls):
    instances = dict()
    return lambda *args,**kargs:instances.setdefault((args,tuple(kargs.items())),cls(args,kargs))


@flyweight
class Spam():
    def __init__(self,a,b):
        self.a = a
        self.b = b


instance01 = Spam(1,2)
instance02 = Spam(2,2)
instance03 = Spam(1,2)

# 运行结果
id(instance01)
51346704
id(instance02)
51346448
id(instance03)
51346704
type(instance01)
<class '__main__.Spam'>

还有一个实现方法,使用mixin 的方法,也很清新可人。谁要继承就可以了

# 使用mixin的方法实现flyweight模式,谁需要谁继承
class FlyweightMaxin():

    _instance = dict()

    @classmethod
    def get_instance(cls,*args,**kargs):
        return cls._instance.setdefault((args,tuple(kargs.items())),cls(*args,**kargs))


class Spam(FlyweightMaxin):

    def __init__(self,a,b):
        self.a = a
        self.b = b


print("instance01->",id(Spam.get_instance(1,2)))
print("instance02->",id(Spam.get_instance(2,2)))
print("instance03->",id(Spam.get_instance(1,2)))
print("type->",type(Spam.get_instance(1,2)))

# 运行结果
instance01-> 51346608
instance02-> 51346448
instance03-> 51346608
type-> <class '__main__.Spam'>

参考文档
python设计模式之享元模式