享元模式(Flyweight)
Flyweight是拳击比赛中轻量级选手的意思,在这里“轻”的是实例的量。
比如下面这个例子中,当有很多网站时,内存中就会有大量的Website实例,而这些实例中存在大量的重复,比如name字段,可能一半的网站的name是product,一半是blog,而不一样的只是user。这个时候可以想办法把相同的东西(name)合并在一个对象内部,而把不同的东西(user)放在对象外部。
用个Web工厂制造出product和blog两种模板,每个类分别对应一个实例,这个实例只有代码段和name,要工作的话还需要将user作为参数传进来。
1.网站类
#!/usr/bin/python
# Filename: web.py
class Website:
def __init__(self, name):
self.name = name
def Use(self, user):
print 'This site is about ' + user.name + '\'s ' + self.name
class WebsiteFactory:
def __init__(self):
self.flyweights = {}
def GetWebsiteCategory(self, key):
if not self.flyweights.has_key(key):
self.flyweights[key] = Website(key)
return self.flyweights[key]
def GetWebsiteCount(self):
return len(self.flyweights)
2.用户类
#!/usr/bin/python
# Filename: user.py
class User:
def __init__(self, name):
self.name = name
3.客户端
#!/usr/bin/python
# Filename: console.py
import web
import user
f = web.WebsiteFactory()
web1 = f.GetWebsiteCategory("product")
web1.Use(user.User('A'))
web2 = f.GetWebsiteCategory("product")
web2.Use(user.User('B'))
web3 = f.GetWebsiteCategory("product")
web3.Use(user.User('C'))
web4 = f.GetWebsiteCategory("blog")
web4.Use(user.User('D'))
web5 = f.GetWebsiteCategory("blog")
web5.Use(user.User('E'))
web6 = f.GetWebsiteCategory("blog")
web6.Use(user.User('F'))
print f.GetWebsiteCount()
(收起)