python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)

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

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

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

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

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

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

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

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

#coding: utf-8

importrandomfrom enum importEnum

TreeType= Enum('TreeType', 'apple_tree cherry_tree peach_tree')classTree:

pool=dict()def __new__(cls, tree_type):

obj=cls.pool.get(tree_type, None)if notobj:

obj= object.__new__(cls)

cls.pool[tree_type]=obj

obj.tree_type=tree_typereturnobjdefrender(self, age, x, y):print('render a tree of type {} and age {} at ({}, {})'.format(self.tree_type, age, x, y))defmain():

rnd=random.Random()

age_min, age_max= 1, 30 #单位为年

min_point, max_point = 0, 100tree_counter=0for _ 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值