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字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
Python文件操作类操作实例详解
Jul 11 Python
python实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
python中验证码连通域分割的方法详解
Jun 04 Python
python+Splinter实现12306抢票功能
Sep 25 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
Pytorch 之修改Tensor部分值方式
Dec 27 Python
tensorflow 变长序列存储实例
Jan 20 Python
python序列类型种类详解
Feb 26 Python
新手入门学习python Numpy基础操作
Mar 02 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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
PHP数据类型之布尔型的介绍
2013/04/28 PHP
php对包含html标签的字符串进行截取的函数分享
2014/06/19 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
Jquery下attr和removeAttr的使用方法
2010/12/28 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python简单进程锁代码实例
2015/04/27 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
python制作朋友圈九宫格图片
2019/11/03 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
新员工入职感言
2014/02/01 职场文书
单位租房协议书范本
2014/12/04 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
JavaScript 反射学习技巧
2021/10/16 Javascript
Nginx 常用配置
2022/05/15 Servers
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL