在考量系统内存合理使用时,通过享元模式可降低性能压力以及降低资源占用;主要实现是通过共享数据这一思想实现资源的合理分配。

在开发项目时,很多情况下会存在过多的相似对象,该对象有相同的共同点,该共同点在程序设计时,可归为共享数据,不同点可以通过其它方式进行传递赋值。

例如做一个瓶子,盘子外观都是相同的,只有内部数据不同,这个时候假设通过常规方式新建不同的对象,该对象的资源分配是不合理的。

假设产品有矿泉水,只有外包装颜色不同,这时就可以使用享元模式。
实现如下,首先新建一个矿泉水类:

class BottledWater(object):objpool = dict()#记录生成对象def show(self, color):#显示一下颜色print(self.name,'颜色',color)def __new__(cls, type):# 使用new 初始化在实例化之前obj_ = cls.objpool.get(type, None)#没有找到对象就实例化if obj_ == None:obj_ = object.__new__(cls)cls.objpool[type] = obj_obj_.name = typereturn obj_

objpool = dict():矿泉水类中,定义了一个objpool 作为一个记录对象的池(字典)
def show(self, color):输出当前对象名以及可变属性颜色
def __new__(cls, type):使用new方法在实例化之前创建对象
obj_ = cls.objpool.get(type, None):在对象池中找到当前类型的对象,没找到则为None
if obj_ == None: :对象找不到则开始初始化对象,并且把当前类型对象存入到记录池中
obj_.name = type:把type赋值给当前name属性,以便之后进行输出显示
最后返回对象 obj_。

经过以上类的编写后,实例化对象,并且查看池中存储了多少个对象:

t1 = BottledWater("矿泉水")
t1.show('红色')
t2 = BottledWater("矿泉水")
t2.show('蓝色')
t3 = BottledWater("矿泉水")
t3.show('绿色')
print('\n')
t1_ = BottledWater("冰红茶")
t1_.show('红色')
t2_ = BottledWater("冰红茶")
t2_.show('蓝色')
t3_ = BottledWater("冰红茶")
t3_.show('绿色')print('对象一共有:',len(BottledWater.objpool))

在未使用享元模式前,以上新建对象的方法应该会新建出6个对象,但是输出显示为2个:

因为类型一个为矿泉水另外一个为冰红茶,两者之间是两个种类;矿泉水新建对象后是共享数据,不同颜色是可变数据,冰红茶与矿泉水是两种不同类型,最后使用len计算池 objpool 长度,判断类的多少,对象总数为2。
完整代码如下:

class BottledWater(object):objpool = dict()#记录生成对象def show(self, color):#显示一下颜色print(self.name,'颜色',color)def __new__(cls, type):# 使用new 初始化在实例化之前obj_ = cls.objpool.get(type, None)#没有找到对象就实例化if obj_ == None:obj_ = object.__new__(cls)cls.objpool[type] = obj_obj_.name = typereturn obj_t1 = BottledWater("矿泉水")
t1.show('红色')
t2 = BottledWater("矿泉水")
t2.show('蓝色')
t3 = BottledWater("矿泉水")
t3.show('绿色')
print('\n')
t1_ = BottledWater("冰红茶")
t1_.show('红色')
t2_ = BottledWater("冰红茶")
t2_.show('蓝色')
t3_ = BottledWater("冰红茶")
t3_.show('绿色')print('对象一共有:',len(BottledWater.objpool))

看得懂的设计模式 享元模式python3 最基本(简单)实现相关推荐

  1. Unity设计模式——享元模式(附代码)

    Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...

  2. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  3. 10-Python与设计模式--享元模式

    10-Python与设计模式--享元模式 一.网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行线下配送.假设其咖啡对象构造如下: class Co ...

  4. 设计模式--享元模式实现C++

    /********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.co ...

  5. 【设计模式】Java设计模式 - 享元模式

    [设计模式]Java设计模式 - 享元模式

  6. 第二十二章 Caché 设计模式 享元模式

    文章目录 第二十二章 Caché 设计模式 享元模式 定义 优点 使用场景 结构图 描述 完整示例 实体类 抽象享元角色 实现享元角色 享元工厂 调用 思考 第二十二章 Caché 设计模式 享元模式 ...

  7. JavaScript设计模式-享元模式

    JavaScript设计模式-享元模式 概念 例子 内部状态与外部状态 享元模式的通用结构 例子 总结 github仓库地址:点击 [设计模式例子](https://github.com/fanhua ...

  8. Java常用设计模式————享元模式

    引言 享元模式,也叫蝇量模式(Flyweight Pattern).运用共享技术有效地支持大量细粒度的对象. 享元模式常用于系统底层开发,解决系统的性能问题.例如数据库连接池,里面都是创建好的连接对象 ...

  9. 设计模式——享元模式具体解释

    0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍.再看后半部分的实例分析.最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...

最新文章

  1. 源代码管理的新15条建议
  2. python 美团api接口对接_震惊!SpaceX火箭数据开放API接口,可用Python进行数据分析...
  3. CUDA 4.0真技术解析
  4. Vue001_模板语法
  5. eclipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin:2.4.3解决方案...
  6. 关于房屋的风水学整理
  7. 运行Hadoop自带的wordcount单词统计程序
  8. CmsEasy 如何安装
  9. cad2010多个文件并排显示_并排查看Excel工作表只需1个小动作,工作效率大涨百倍!...
  10. 谷粒商城:09.商品服务 — 品牌管理
  11. MongoDB复制集全量同步改进
  12. 凸优化问题,凸二次规划问题QP,凸函数
  13. Android JTT 808-2011 道路运输车辆卫星定位系统终端通讯协议及数据格式
  14. 二、通用、布局、导航组件
  15. Java学习年度总结
  16. DAX: 用SWITCH函数替换嵌套IF函数
  17. 最优化理论——可行方向·梯度投影法
  18. 在fastreport里转换金额大小写
  19. TCP三次握手四次挥手(三国版)
  20. Java object类型转换为int类型

热门文章

  1. 快速打造一个MINI自动发布系统
  2. 微软开源Power Fx,基于Excel的低代码编程语言
  3. 使用Azure Functions玩转Serverless
  4. WSL2 支持挂载物理磁盘,Windows 可直接访问 ext4
  5. .Net Core in Docker极简入门(下篇)
  6. TomatoLog-1.1.0实现ILoggerFactory
  7. 架构为什么要以领域为核心
  8. 徐磊(Devops):一名写了十几年代码但还没写够的程序员
  9. 在.NET Core中使用Exceptionless分布式日志收集框架
  10. EF Core 数据库 Provider 一览