大话设计模式Python实现- 享元模式
享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象.
下面是一个享元模式的demo:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 """ 6 大话设计模式 7 设计模式——享元模式 8 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象 9 对一个类进行的实例,只在第一次使用时建立,其他时候是用同一个实例,减少内存的开销 10 """ 11 # 抽象网站类 12 class Website(object): 13 14 def use(self): 15 pass 16 17 # 具体网站类 18 class ConcreteWebsite(Website): 19 20 def __init__(self, name): 21 self.name = name 22 23 def use(self): 24 print "网站分类",self.name 25 # 不共享的网站类 26 class UnshareConcreteWebsite(Website): 27 def __init__(self, name): 28 self.name = name 29 30 def use(self): 31 print "不共享网站分类",self.name 32 33 # 网站工厂 34 class WebsiteFactory(object): 35 36 def __init__(self): 37 self.hashtable = dict() 38 39 # 获取网站类 如果存在直接返回,如果不存在建好之后返回 40 def get_website(self, key): 41 if not key in self.hashtable: 42 self.hashtable[key] = ConcreteWebsite(key) 43 return self.hashtable[key] 44 45 # 网站实例的个数 46 def get_website_count(self): 47 return len(self.hashtable.keys()) 48 49 if __name__ == "__main__": 50 factory = WebsiteFactory() 51 f1 = factory.get_website("blog") 52 f2 = factory.get_website("blog") 53 f3 = factory.get_website("blog") 54 f4 = factory.get_website("website") 55 f5 = factory.get_website("website") 56 f6 = factory.get_website("website") 57 f7 = UnshareConcreteWebsite("test") 58 f1.use() 59 f2.use() 60 f3.use() 61 f4.use() 62 f5.use() 63 f6.use() 64 f7.use()
上面类的设计如下图:
享元模式可以避免大量非常相似类的开销,在程序设计中,有时会生成大量细粒度的类实例来表示数据,如果这些实例除了几个参数外基本相同,就可以把参数已到实例外面,在方法调用时,把它们传进来,就可以通过共享大幅度减少单个实例的数目
作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。