基本概念
解决大量细粒度对象引起的内存问题。
对细粒度的对象进行分析,拆分为内部状态和外部状态。
内部状态->可以共享的(不变的),对所有对象来说都是一致的的状态;
外部状态->每个对象各自个性化的状态。
实现代码
实现的方法 很多,个人比较喜欢下面这个,简单明了
# 使用装饰器,闭包实现内部状态统一
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设计模式之享元模式