享元模式(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()

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

  1. Java创新型模式_java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  2. 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)

    七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...

  3. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

  4. 设计模式-创建型模式-建造者模式

    设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...

  5. 设计模式-创建型模式-模板方法

    设计模式-创建型模式-模板方法 定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义一个算法的步骤. protected 对于本包及其子类可见. 类图 代码 代 ...

  6. 设计模式-创建型模式-工厂模式(工厂三兄弟)

    设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...

  7. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  8. 设计模式-创建型模式-抽象工厂模式

    工程源码:设计模式-创建型模式-抽象工厂模式https://download.csdn.net/download/qq_40788199/85544119 码云:设计模式-创建型模式-抽象工厂模式ht ...

  9. 设计模式-创建型模式-简单工厂模式

    工程地址:设计模式-简单工厂源码-C++文档类资源-CSDN下载C++设计模式-创建型模式-简单工厂模式源码更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.n ...

最新文章

  1. 创建快捷方式命令_如何使用桌面快捷方式运行命令提示符命令
  2. javascript常用排序算法总结
  3. Windows配置jdk环境变量JAVA_HOME与path
  4. VS2010打开项目提示未能正确加载解决方案中一个或多个项目
  5. 操作系统(三十四)覆盖和交换
  6. php处理heic格式图片,iPhone 照片为heic格式怎么处理?
  7. 0118互联网新闻 | 抖音成央视春晚独家社交媒体传播平台;石墨任务清单小程序上线...
  8. 最大似然估计和最大后验概率
  9. Windows Server 2012R2之重复数据删除实战
  10. Oracle学习笔记--导航
  11. 为啥你写的代码总是这么复杂?
  12. 浅谈实现SQL Server远距离异地容灾
  13. Spring boot 之搭建
  14. javascript模式 (3)——工厂模式和装饰模式
  15. STC学习:看谁手速快
  16. [VS code - SSH Remote] ln: failed to create hard link ... File exists
  17. 校园wifi免费上网
  18. Win 10 任务栏中Google开启时出现两个Google图标
  19. C++实验题8 数组使用(bushi)
  20. 不是有效的win32应用程序_什么是模块,各种模块的有效行为(1)

热门文章

  1. 设计灵感|如何设计出简洁吸引人的字体海报?
  2. 有了这组新年元旦海报PSD模板素材,不愁晚交稿!
  3. C4D电商促销活动背景素材|设计提升,只差一个背景
  4. 新拟物素材|时髦iOS 主屏幕图标
  5. 高品质空间合成海报,让夜色更迷人
  6. 怪异的万圣节:图标素材,给对生活有仪式感的设计师!
  7. 电商设计提升水平,需要优秀的模板素材进行临摹练习!
  8. mysql java教程_mysql总结
  9. C++虚函数的实现原理(最通俗但并不想专业的解释)
  10. Transitions Among the Processor’s Operating Modes