享元模式:
运用共享技术有效地支持大量细粒度的对象。
内部状态:享元对象中不会随环境改变而改变的共享部分。比如围棋棋子的颜色。
外部状态:随环境改变而改变、不可以共享的状态就是外部状态。比如围棋棋子的位置。
应用场景:程序中使用了大量的对象,如果删除对象的外部状态,可以用相对较少的共享对象取代很多组对象,就可以考虑使用享元模式。
内部状态:享元对象中不会随环境改变而改变的共享部分。比如围棋棋子的颜色。
外部状态:随环境改变而改变、不可以共享的状态就是外部状态。比如围棋棋子的位置。
应用场景:程序中使用了大量的对象,如果删除对象的外部状态,可以用相对较少的共享对象取代很多组对象,就可以考虑使用享元模式。
#encoding=utf-8
#
#by panda
#享元模式
def printInfo(info):
print unicode(info, 'utf-8').encode('gbk')
#抽象享元类:
class WebSite():
def Use(self):
pass
#具体享元类
class ConcreteWebSite(WebSite):
name = ''
def __init__(self,name):
self.name = name
def Use(self, user):
printInfo('网站分类:%s 用户 %s' % (self.name,user.name))
#享元工厂类
class WebSiteFactory():
WebSites = {}
def GetWebSiteCategory(self, key):
if self.WebSites.has_key(key) == False:
self.WebSites[key] = ConcreteWebSite(key)
return self.WebSites[key]
def GetWebSiteCount(self):
return len(self.WebSites)
#用户
class User():
name = None;
def __init__(self,name):
self.name = name
def clientUI():
f = WebSiteFactory()
fx = f.GetWebSiteCategory('产品展示')
fy = f.GetWebSiteCategory('产品展示')
fz = f.GetWebSiteCategory('产品展示')
fx.Use(User('小菜'))
fy.Use(User('大鸟'))
fz.Use(User('娇娇'))
fx = f.GetWebSiteCategory('博客')
fy = f.GetWebSiteCategory('博客')
fz = f.GetWebSiteCategory('博客')
fx.Use(User('老顽童'))
fy.Use(User('郭靖'))
fz.Use(User('黄蓉'))
printInfo('网站分类的总数:%d' % f.GetWebSiteCount())
return
if __name__ == '__main__':
clientUI();
类图: