享元模式(Flyweight Pattern)主要用于减小建立对象的数量,以减小内存占用和提升性能。这种类型的设计模式属于结构型模式,它提供了减小对象数量从而改善应用所需的对象结构的方式。web
享元模式尝试重用现有的同类对象,若是未找到匹配的对象,则建立新对象。咱们将经过建立 5 个对象来画出 20 个分布于不一样位置的圆来演示这种模式。因为只有 5 种可用的颜色,因此 color 属性被用来检查现有的 Circle 对象。chrome
代码__new__方法里面的看起来像单例模式,但与单例模式有些区别。设计模式
好比selenium webdriver尤为须要控制是你画的数量,每实例化一个driver出来都弹出一个浏览器,消耗巨大的内存不说,上下文之间的浏览器状态还共享不了。浏览器
单例模式能够控制无论实例化多少个driver,只会弹出一次浏览器,不会无数次弹出新的浏览器。app
享元模式能够控制无论实例化多少个driver,不会无数次弹出新的浏览器。最多弹出一个chrome浏览器或者firefox浏览器。也就是同种类浏览器只能弹出一个。dom
单例模式,一个猫类,最多只能实例化一个猫,无论是白毛仍是黑猫。性能
享元模式,一个猫类,最多只会实例化出来一个黑猫和白猫实例,不会出现两个白猫。spa
# 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()