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

最新文章

  1. 【代码笔记】iOS-获得现在的日期
  2. c++ redis-client
  3. 《高可用MySQL》1 – Windows环境下压缩版MySQL安装
  4. Android下的数据储存方式(三)
  5. iOS 7中使用UINavigationController进行pop崩溃
  6. C# windows窗体程序打包安装及卸载
  7. 格而知之7:我所理解的Runtime(2)
  8. java-进程
  9. mongodb集群+分片部署(二)
  10. GCD之全局、主线程
  11. 一个看起来不像中年人的中年人,带着两个初出茅庐的小伙子儿,用git管理项目代码的进击之路
  12. 生成.project、.classpath文件
  13. 【不懂】spring bean生命周期
  14. 掌上电脑设备可以使用Ubuntu MATE 18.10 Linux映像了
  15. ThreadLocal与Synchronized
  16. 42 前端HTML
  17. ThinkPHP 3.2 调用自定义函数库
  18. Tutorial 6: ViewSets & Routers
  19. "reason":"No handler for type [attachment] declared on field [file]" 最完全解决方案
  20. csharp:Microsoft.Ink 手写识别(HandWriting Recognition)

热门文章

  1. System类与Runtime类
  2. java.lang.ClassCastException: cn.itcase.serviceImpl.servicestudentImpl cannot be cast to javax.servlet.Servlet
  3. awk 入门教程
  4. spring和springMVC的面试问题总结
  5. Facebook's React vs AngularJS: A Closer Look
  6. Amazon.com 美国亚马逊 直邮中国 手把手教程(转)
  7. shell编程中的控制判断语句
  8. 使用vue.js路由踩到的一个坑Unknown custom element
  9. 使用RStudio远程连接MySQL
  10. Atitit 视图参数解决方案 oracle版和mysql版本 attilax总结.docx