看得懂的设计模式 享元模式python3 最基本(简单)实现
在考量系统内存合理使用时,通过享元模式可降低性能压力以及降低资源占用;主要实现是通过共享数据这一思想实现资源的合理分配。
在开发项目时,很多情况下会存在过多的相似对象,该对象有相同的共同点,该共同点在程序设计时,可归为共享数据,不同点可以通过其它方式进行传递赋值。
例如做一个瓶子,盘子外观都是相同的,只有内部数据不同,这个时候假设通过常规方式新建不同的对象,该对象的资源分配是不合理的。
假设产品有矿泉水,只有外包装颜色不同,这时就可以使用享元模式。
实现如下,首先新建一个矿泉水类:
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 最基本(简单)实现相关推荐
- Unity设计模式——享元模式(附代码)
Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...
- Python设计模式-享元模式
Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...
- 10-Python与设计模式--享元模式
10-Python与设计模式--享元模式 一.网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行线下配送.假设其咖啡对象构造如下: class Co ...
- 设计模式--享元模式实现C++
/********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.co ...
- 【设计模式】Java设计模式 - 享元模式
[设计模式]Java设计模式 - 享元模式
- 第二十二章 Caché 设计模式 享元模式
文章目录 第二十二章 Caché 设计模式 享元模式 定义 优点 使用场景 结构图 描述 完整示例 实体类 抽象享元角色 实现享元角色 享元工厂 调用 思考 第二十二章 Caché 设计模式 享元模式 ...
- JavaScript设计模式-享元模式
JavaScript设计模式-享元模式 概念 例子 内部状态与外部状态 享元模式的通用结构 例子 总结 github仓库地址:点击 [设计模式例子](https://github.com/fanhua ...
- Java常用设计模式————享元模式
引言 享元模式,也叫蝇量模式(Flyweight Pattern).运用共享技术有效地支持大量细粒度的对象. 享元模式常用于系统底层开发,解决系统的性能问题.例如数据库连接池,里面都是创建好的连接对象 ...
- 设计模式——享元模式具体解释
0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍.再看后半部分的实例分析.最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...
最新文章
- 源代码管理的新15条建议
- python 美团api接口对接_震惊!SpaceX火箭数据开放API接口,可用Python进行数据分析...
- CUDA 4.0真技术解析
- Vue001_模板语法
- eclipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin:2.4.3解决方案...
- 关于房屋的风水学整理
- 运行Hadoop自带的wordcount单词统计程序
- CmsEasy 如何安装
- cad2010多个文件并排显示_并排查看Excel工作表只需1个小动作,工作效率大涨百倍!...
- 谷粒商城:09.商品服务 — 品牌管理
- MongoDB复制集全量同步改进
- 凸优化问题,凸二次规划问题QP,凸函数
- Android JTT 808-2011 道路运输车辆卫星定位系统终端通讯协议及数据格式
- 二、通用、布局、导航组件
- Java学习年度总结
- DAX: 用SWITCH函数替换嵌套IF函数
- 最优化理论——可行方向·梯度投影法
- 在fastreport里转换金额大小写
- TCP三次握手四次挥手(三国版)
- Java object类型转换为int类型