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 相关文章推荐
Linux下Python获取IP地址的代码
Nov 30 Python
Python中使用Beautiful Soup库的超详细教程
Apr 30 Python
详解Python的Lambda函数与排序
Oct 25 Python
python实现隐马尔科夫模型HMM
Mar 25 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
pandas中去除指定字符的实例
May 18 Python
python查看模块,对象的函数方法
Oct 16 Python
Python一键安装全部依赖包的方法
Aug 12 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 Python
使用django自带的user做外键的方法
Nov 30 Python
pytorch 实现在测试的时候启用dropout
May 27 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&MYSQL分页原理及实现
2007/01/02 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
Python的lambda匿名函数的简单介绍
2013/04/25 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
python制作抖音代码舞
2019/04/07 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
python 自动识别并连接串口的实现
2021/01/19 Python
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
2019年.net常见面试问题
2012/02/12 面试题
大学四年职业生涯规划书范文
2014/01/02 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis