看得懂的设计模式 享元模式python3 最基本(简单)实现
时间:2022-07-28
本文章向大家介绍看得懂的设计模式 享元模式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 = type
return 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 = type
return 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))
- CDN加速下通过nginx获取网站访客真实ip
- linux centos7服务器使用密钥登录ssh同时禁止root密码登录
- linux nginx服务器安装verynginx防止CC攻击
- linux nginx安装HttpGuard防止CC攻击
- wordpress您的主机禁用了mail()函数 SMTP邮件通知解决方法
- 我的编程之路:知识管理与知识体系
- UTF-8 为什么会比 UTF-16 浪费?
- 码农也要学算法
- 19 个常用的 JavaScript 简写方法
- 从零开始写 PHP 扩展
- Linux 基础:文件查找 find
- 区块链入门教程
- AI 玩微信小游戏跳一跳的正确姿势,Auto-Jump 算法详解
- 正则表达式实例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【赵渝强老师】在MongoDB中使用MapReduce方式计算聚合
- 2020-09-13:判断一个正整数是a的b次方,a和b是整数,并且大于等于2,如何求解?
- ASP.NET Core 性能优化最佳实践
- 如何在Vue中使用云开发的云函数,实现邮件发送
- 乐观锁与悲观锁
- 为什么配置文件加密了数据库配置信息,Spring Boot仍能成功连接数据库
- SpringBoot开发微信公众号
- 猿实战10——动态表单之实现类目属性绑定
- 猿实战11——类目属性绑定之el-tree的使用
- 猿实战12——类目属性之动态绑定
- 一个maskrcnn的目标检测和实例分割的小例子
- Nginx系列:Nginx自带后端健康检查
- 消息队列之推还是拉,RocketMQ 和 Kafka是如何做的?
- Nginx系列:root与alias指令用法的区别
- Redis系列:Linux下部署Redis 6.x 版本