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 相关文章推荐
详解Python的Lambda函数与排序
Oct 25 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
python生成二维码的实例详解
Oct 29 Python
python 动态加载的实现方法
Dec 22 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
Python之列表实现栈的工作功能
Jan 28 Python
详解python中的time和datetime的常用方法
Jul 08 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 Python
基于Python爬取股票数据过程详解
Oct 21 Python
Python 实现一个简单的web服务器
Jan 03 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 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
德劲1103的维修打理经验
2021/03/02 无线电
php 数学运算验证码实现代码
2009/10/11 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
AngularJS入门之动画
2016/07/27 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
python使用htmllib分析网页内容的方法
2015/05/08 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
PHP面试题-$message和$$message的区别
2015/12/08 面试题
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
留学自荐信
2013/10/10 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
幼儿园中班评语大全
2014/04/17 职场文书
一帮一活动总结
2014/05/08 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
爱护公共设施的标语
2014/06/24 职场文书
保险专业求职信
2014/07/07 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
2014年营业员工作总结
2014/11/18 职场文书
利用python做表格数据处理
2021/04/13 Python
正则表达式拆分url实例代码
2022/02/24 Java/Android
Redis keys命令的具体使用
2022/06/05 Redis