zoukankan      html  css  js  c++  java
  • 设计模式-创建型模式,python享元模式 、python单例模式(7)

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

    享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。

    代码__new__方法里面的看起来像单例模式,但与单例模式有些区别。

    比如selenium webdriver尤其需要控制是你画的数量,每实例化一个driver出来都弹出一个浏览器,消耗巨大的内存不说,上下文之间的浏览器状态还共享不了。

    单例模式可以控制不管实例化多少个driver,只会弹出一次浏览器,不会无数次弹出新的浏览器。

    享元模式可以控制不管实例化多少个driver,不会无数次弹出新的浏览器。最多弹出一个chrome浏览器或者firefox浏览器。也就是同种类浏览器只能弹出一个。

    单例模式,一个猫类,最多只能实例化一个猫,不管是白毛还是黑猫。

    享元模式,一个猫类,最多只会实例化出来一个黑猫和白猫实例,不会出现两个白猫。

    # coding: utf-8
    
    import random
    from enum import Enum
    
    TreeType = Enum('TreeType', 'apple_tree cherry_tree peach_tree')
    
    
    class Tree:
        pool = dict()
    
        def __new__(cls, tree_type):
            obj = cls.pool.get(tree_type, None)
            if not obj:
                obj = object.__new__(cls)
                cls.pool[tree_type] = obj
                obj.tree_type = tree_type
            return obj
    
        def render(self, age, x, y):
            print('render a tree of type {} and age {} at ({}, {})'.format(self.tree_type, age, x, y))
    
    
    def main():
        rnd = random.Random()
        age_min, age_max = 1, 30    # 单位为年
        min_point, max_point = 0, 100
        tree_counter = 0
    
        for _ in range(10):
            t1 = Tree(TreeType.apple_tree)
            t1.render(rnd.randint(age_min, age_max),
                      rnd.randint(min_point, max_point),
                      rnd.randint(min_point, max_point))
            tree_counter += 1
    
        for _ in range(3):
            t2 = Tree(TreeType.cherry_tree)
            t2.render(rnd.randint(age_min, age_max),
                      rnd.randint(min_point, max_point),
                      rnd.randint(min_point, max_point))
            tree_counter += 1
    
        for _ in range(5):
            t3 = Tree(TreeType.peach_tree)
            t3.render(rnd.randint(age_min, age_max),
                      rnd.randint(min_point, max_point),
                      rnd.randint(min_point, max_point))
            tree_counter += 1
    
        print('trees rendered: {}'.format(tree_counter))
        print('trees actually created: {}'.format(len(Tree.pool)))
    
        t4 = Tree(TreeType.cherry_tree)
        t5 = Tree(TreeType.cherry_tree)
        t6 = Tree(TreeType.apple_tree)
        print('{} == {}? {}'.format(id(t4), id(t5), id(t4) == id(t5)))
        print('{} == {}? {}'.format(id(t5), id(t6), id(t5) == id(t6)))
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    HadoopDB:混合分布式系统
    分布式一致性
    Hadoop和RDBMS的混合系统介绍
    《Facebook效应》
    《程序员的思维修炼》
    KMP算法实现
    关于毕业季照片分享的思考
    SDN:软件定义网络
    退出域不能够重新加入域,郁闷呀
    ◆聚会时可以玩的游戏◆
  • 原文地址:https://www.cnblogs.com/ydf0509/p/8525935.html
Copyright © 2011-2022 走看看