Python设计模式之享元模式原理与用法实例分析


Posted in Python onJanuary 11, 2019

本文实例讲述了Python设计模式之享元模式原理与用法。分享给大家供大家参考,具体如下:

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象.

下面是一个享元模式的demo:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Andy'
"""
大话设计模式
设计模式——享元模式
享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象
对一个类进行的实例,只在第一次使用时建立,其他时候是用同一个实例,减少内存的开销
"""
# 抽象网站类
class Website(object):
  def use(self):
    pass
# 具体网站类
class ConcreteWebsite(Website):
  def __init__(self, name):
    self.name = name
  def use(self):
    print "网站分类",self.name
# 不共享的网站类
class UnshareConcreteWebsite(Website):
  def __init__(self, name):
    self.name = name
  def use(self):
    print "不共享网站分类",self.name
# 网站工厂
class WebsiteFactory(object):
  def __init__(self):
    self.hashtable = dict()
  # 获取网站类 如果存在直接返回,如果不存在建好之后返回
  def get_website(self, key):
    if not key in self.hashtable:
      self.hashtable[key] = ConcreteWebsite(key)
    return self.hashtable[key]
  # 网站实例的个数
  def get_website_count(self):
    return len(self.hashtable.keys())
if __name__ == "__main__":
  factory = WebsiteFactory()
  f1 = factory.get_website("blog")
  f2 = factory.get_website("blog")
  f3 = factory.get_website("blog")
  f4 = factory.get_website("website")
  f5 = factory.get_website("website")
  f6 = factory.get_website("website")
  f7 = UnshareConcreteWebsite("test")
  f1.use()
  f2.use()
  f3.use()
  f4.use()
  f5.use()
  f6.use()
  f7.use()

运行结果:

Python设计模式之享元模式原理与用法实例分析

上面类的设计如下图:

 Python设计模式之享元模式原理与用法实例分析

享元模式可以避免大量非常相似类的开销,在程序设计中,有时会生成大量细粒度的类实例来表示数据,如果这些实例除了几个参数外基本相同,就可以把参数已到实例外面,在方法调用时,把它们传进来,就可以通过共享大幅度减少单个实例的数目

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
Apr 13 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
详解opencv Python特征检测及K-最近邻匹配
Jan 21 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 Python
python 函数中的参数类型
Feb 11 Python
flask开启多线程的具体方法
Aug 02 Python
详解Anaconda安装tensorflow报错问题解决方法
Nov 01 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 Python
详解从Django Rest Framework响应中删除空字段
Jan 11 #Python
python对列进行平移变换的方法(shift)
Jan 10 #Python
对python模块中多个类的用法详解
Jan 10 #Python
python 图像平移和旋转的实例
Jan 10 #Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 #Python
详解pandas安装若干异常及解决方案总结
Jan 10 #Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 #Python
You might like
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
使用php清除bom示例
2014/03/03 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
JavaScript运动框架 多物体任意值运动(三)
2017/05/17 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
python绘制随机网络图形示例
2019/11/21 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
《天安门广场》教学反思
2014/04/23 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
先进工作者个人总结
2015/02/15 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS
微信小程序实现轮播图指示器
2022/06/25 Javascript