python 享元模式_python设计模式–享元模式

享元模式最核心的地方应该就是“享”,共享一个通用的东西,在你有不同的要求时也可以达到不同的实现。

下面举个栗子

上面这个例子大家通用的功能就是绘制圆形,但是我们可以绘制不同颜色的圆形,那么这个就可以使用享元模式来优化,其实这个功能太简单了,不需要设计模式也可以来实现。仅以此举例说明

下面给出享元模式的术语描述,当然会结合上面的给的例子来描述专业术语的含义

所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。

共享模式是支持大量细粒度对象的复用,所以享元模式要求能够共享的对象必须是细粒度对象。

在了解享元模式之前我们先要了解两个概念:内部状态、外部状态。

内部状态:在享元对象内部不随外界环境改变而改变的共享部分。

哈哈,这个内部状态结合上面的例子就是绘制圆形这个内部状态都是一样的

外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。

这个外部状态就是不同颜色的情况

由于享元模式区分了内部状态和外部状态,所以我们可以通过设置不同的外部状态使得相同的对象可以具备一些不同的特性,而内部状态设置为相同部分。在我们的程序设计过程中,我们可能会需要大量的细粒度对象来表示对象,如果这些对象除了几个参数不同外其他部分都相同,这个时候我们就可以利用享元模式来大大减少应用程序当中的对象。如何利用享元模式呢?这里我们只需要将他们少部分的不同的部分当做参数移动到类实例的外部去,然后再方法调用的时候将他们传递过来就可以了。这里也就说明了一点:内部状态存储于享元对象内部,而外部状态则应该由客户端来考虑

享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。

自己写了一版享元模式的代码,利用抽象基类,结合工厂来操作

# -*- coding: utf-8 -*-

# @Time : 2018/8/7 下午10:56

# @Author : zhusimaji

# @File : flyweight_more.py

# @Software: PyCharm

from abc import ABCMeta,abstractmethod

class shape(metaclass=ABCMeta):

@abstractmethod

def draw(self):

pass

class circle(shape,object):

def __init__(self,color):

self.color=color

def draw(self):

print('circle is {}'.format(self.color))

class shapeFactory(object):

__shape_dict=dict()

@classmethod

def get_shape(cls,color):

if color not in cls.__shape_dict:

new_shape=circle(color)

cls.__shape_dict[color]=new_shape

return new_shape

else:

return cls.__shape_dict[color]

@classmethod

def get_shape_length(cls):

return len(cls.__shape_dict)

if __name__ == '__main__':

a=shapeFactory.get_shape('red')

b = shapeFactory.get_shape('red')

c = shapeFactory.get_shape('yellow')

d = shapeFactory.get_shape('blue')

e = shapeFactory.get_shape('blue')

print(shapeFactory.get_shape_length())

上面的代码运行你会发现实际上生成的类对象只有三个,因为在工厂类中我们避免了重复构造多余的对象,充分利用了现有的对象避免重复的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值