• 大话设计模式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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    .net(关于字符串的相等问题[比较重要])
    .net(基本数据类型,枚举类型,枚举字符串的相互转化)
    如何安全的读入一个整数或者浮点数
    .net(数组)
    什么是EAI?
    PowerShell 入门
    sql server 2005 如何删除前几条记录或重复记录
    如何查看客户端的IP地址,机器名,MAC地址,登陆名等信息
    sql server 2005 几个常用的存储过程或函数
    ASP.NET 母版页的加载顺序
  • 原文地址:https://www.cnblogs.com/onepiece-andy/p/python-flyweight-pattern.html
Copyright © 2020-2023  润新知