看得懂的设计模式 享元模式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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

creo管道设计教程_CREO/PROE产品设计教程之四芯花线建模,加深对关系式的认识...

阅读完,如果觉得有用,那么点击"关注"和点赞是对作者的一种尊重和鼓励。版权所有,抄袭必究。春节前,基本敲定和相关知名出版社在2020年的图书创作及出版计划。文:钟日铭我曾经介绍过三芯"花线"建模…

Qt 第一步 HelloWorld 的第一个程序

简言 Qt 是基于C的 GUI 解决方案。QT简单易学(底层封装的好)、跨平台、相关资料易得到。 开始写Qt 相关的文章的主要原因是,我本人在编写一个视频录制及相关处理的项目,写到一半发现.net winform 相关UI的处理限制较大&#xff…

ArcGIS 10.x属性表乱码问题解决办法

ArcGIS 10.x的版本,文件属性表老出现乱码的问题。 解决方法:在Cmd命令行中输入以下命令: reg add HKEY_CURRENT_USER\Software\ESRI\Desktop10.6\Common\CodePage /v dbfDefault /t REG_SZ /d 936 /f 版本找对应的该就行,10.2 …

SAP MM 采购订单收货被取消了还是不能增加新的delivery cost!

SAP MM 采购订单收货被取消了还是不能增加新的delivery cost! PO# 8500015169, we did GR and cancelled GR, there is no IR for this PO at present. ME22N, try to add a delivery cost ZCIP in the item, You cannot enter new delivery costs Message no. V1631 Diag…

webots仿真报警[ERROR] [1703399199.459991029]: Sampling period is not valid.

一、故障现象 在运行interace传感器使能程序时,报警[ERROR] [1703399199.459991029]: Sampling period is not valid. [ERROR] [1703399199.460080083]: Failed to enable lidar.并发生崩溃。 二、解决方式 1、尝试将程序中的TIME_STEP数值改为与WOrldInfo中的bas…

python3 最简单的实现 模版设计模式

在项目开发过程时,遇见某些子类的逻辑处理流程大致相同,可是用模板模式减少代码冗余,降低耦合。 例如实现某一窗体或者页面启动时,第一步需要加载启动界面图片资源,第二步加载个人信息,第三步加载个人钱包…

玩转CSS选择器(一) 之 使用方法介绍

前言 前几天整理了CSS一些技术关键字,但是因为自己的知识过于单薄,觉得考虑的不充分有欠缺,随后便在sf.gg提出了这个问题《关于CSS核心技术关键字都有哪些?》,也是为了让厉害的人一起参与进来,用他们的经验…

php基础-1

//echo "hello","aaaa";//输出语法,可以输出多个字符串//print "world"; //可以输出,只能输出一个字符串 用"."拼接可以输出,用","拼接直接报错 //数据类型 int,double,float,string,char…

工业相机和普通相机的区别详解_数码单反相机和胶片单反相机的区别

从相机出世到现在,相机的种类可以分为两种,一个是早期的胶片相片,另一个是现在的数码相机,数码相机的种类也是有很多种,其中最为常见就是单反相机了。那么今天我们就来看看胶片机和单反的区别。相机的种类总的来说可以…

ArcGIS 10.6 Data Interoperability Tools的安装与使用(附安装包下载)

ArcGIS平台中提供了一个数据交互操作工具Data Interoperability Tools,安装Desktop的时候不是一并安装的,这样导致Data Interoperability Tools工具箱下的工具(如Quick Import)全面有一个红色的叉号,无法正常使用,解决办法是手动安装Data Interoperability Tools,位于软…

女朋友强依赖我!我引入IOC后,从此我们的关系微妙而稳固!

此文从面向对象设计角度分析依赖倒置原则,引入依赖注入,IOC相关内容进行探讨,文中引用女朋友案例可能引起分手风险,故理解为 new 对象。想起在学校的时候,有一个任务就是设计一款宠物商店项目。那时候引入三层架构设计…

Qt 第二步 槽与信号(一) 实现点击按钮并弹窗

信号与槽是Qt中的核心,也是Qt的特有的。在Qt中信号与槽的关键字为slots、signals、emit。 具体信号与槽将会在下一节中详细说明,因为担心一些读者在没了解过槽与信号前直接讲述过深导致门槛提高,阅读困难,所以当前这一篇文将在不理…

语言 分组计算hr_干货 | HR不得不知的面试技巧

面试是求职者倍感煎熬的时刻,但其实,面试也让不少HR们颇有压力。毕竟,要在短时间内快速了解一个人,并判断是否适合岗位、业务部门会不会满意、能不能适应企业文化等并不容易。所以,今天Anna给大家整理了一份面试问题汇…

python3 爬虫第一步 简单获取网页基本信息

注:本系列专栏需要有简单的python3 语言基础 爬虫的相关作用在此就不再说明,相信能够点进该系列文章的读者都已经了解了爬虫是什么,并且能够做什么。由于是发布在互联网的文章,所以系列文章都不以书籍的方式从头到尾的叙述作用及其…

将旧版 WCF 应用程序迁移到 CoreWCF

前言CoreWCF 项目团队发布了 CoreWCF 的 1.0 版本,这是 WCF 到 .NET Core 平台的移植。我觉得,CoreWCF 适用于这类场景使用——基于 WCF 的旧版应用程序已在 Windows 平台上运行了很多年,但是希望将代码迁移到 .NET Core,以利用 L…

记录我的学习历程--二维数组解决平面图形题

打印出3 7 2 4 6 81 5 9代码如下转载于:https://blog.51cto.com/4139737/1684269

实现线段切割法_漫画:如何实现抢红包算法?

发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则?1.所有人抢到金额之和等于红包金额,不能超过,也不能少于。2.每个人至少抢到一分钱。3.要保证所有人抢到金额的几率相等。小灰的思路是什么样呢?每…

python3 爬虫第二步Selenium 使用简单的方式抓取复杂的页面信息

Selenium 简介 该系列专栏上一篇爬虫文章点击这里。 网站复杂度增加,爬虫编写的方式也会随着增加。使用Selenium 可以通过简单的方式抓取复杂的网站页面,得到想要的信息。 Selenium 是操作浏览器进行自动化,例如自动化访问网站&#xff0c…

windows远程连接linux-安装xfce界面,ubuntn添加新用户

参考:“ 使用xrdp实现windows 远程桌面连接linux” http://blog.csdn.net/qq_33530388/article/details/64502902; http://www.linuxidc.com/Linux/2017-04/142690.htm 之前一直用mstsc连接windows主机,今天想用此来连接linux主机时,发现 连…

Qt 如何处理密集型耗时的事情

有时候需要处理一些跟界面无关的但非常耗时的事情,这些事情跟界面在同一个线程中,由于时间太长,导致界面无法响应,处于“假死”状态。例如:在应用程序中保存文件到硬盘上,从开始保存直到文件保存完毕&#…