享元

享元模式用于对大量细粒度对象的支持。一个应用中如果使用了大量的对象,会造成很大的存储开销。由于享元对象可以被共享,所以可以使用相对较少的享元对象来替代组对象。

以下给出一个享元模式的示例,读者可以在交互式解释器中实验来体会享元模式的用途。

import weakref


class Card(object):
	_CardPool = weakref.WeakValueDictionary()
	
	def __new__(cls, value, suit):
		obj = Card._CardPool.get(value + suit, None)
		if not obj:
			obj = object.__new__(cls)
			Card._CardPool[value + suit] = obj
			obj.value, obj.suit = value, suit
		return obj
	
	def __str__(self):
		return "Card: {0} {1}".format(self.value, self.suit)


c1 = Card('1', 'h')
c2 = Card('2', 'h')
print(c1 == c2)
print(id(c1), id(c2))