前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >看得懂的设计模式 享元模式python3 最基本(简单)实现

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

原创
作者头像
1_bit
修改2020-07-06 10:39:10
2040
修改2020-07-06 10:39:10
举报
文章被收录于专栏:我的知识小屋我的知识小屋

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

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

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

假设产品有矿泉水,只有外包装颜色不同,这时就可以使用享元模式。

实现如下,首先新建一个矿泉水类:

代码语言:txt
复制
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_。

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

代码语言:txt
复制
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。

完整代码如下:

代码语言:txt
复制
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))

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档