共计 1721 个字符,预计需要花费 5 分钟才能阅读完成。
享元模式最核心的地方应该就是“享”,共享一个通用的东西,在你有不同的要求时也可以达到不同的实现。
下面举个栗子
上面这个例子大家通用的功能就是绘制圆形,但是我们可以绘制不同颜色的圆形,那么这个就可以使用享元模式来优化,其实这个功能太简单了,不需要设计模式也可以来实现。仅以此举例说明
下面给出享元模式的术语描述,当然会结合上面的给的例子来描述专业术语的含义
所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。
共享模式是支持大量细粒度对象的复用,所以享元模式要求能够共享的对象必须是细粒度对象。
在了解享元模式之前我们先要了解两个概念:内部状态、外部状态。
内部状态:在享元对象内部不随外界环境改变而改变的共享部分。
哈哈,这个内部状态结合上面的例子就是绘制圆形这个内部状态都是一样的
外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。
这个外部状态就是不同颜色的情况
由于享元模式区分了内部状态和外部状态,所以我们可以通过设置不同的外部状态使得相同的对象可以具备一些不同的特性,而内部状态设置为相同部分。在我们的程序设计过程中,我们可能会需要大量的细粒度对象来表示对象,如果这些对象除了几个参数不同外其他部分都相同,这个时候我们就可以利用享元模式来大大减少应用程序当中的对象。如何利用享元模式呢?这里我们只需要将他们少部分的不同的部分当做参数移动到类实例的外部去,然后再方法调用的时候将他们传递过来就可以了。这里也就说明了一点:内部状态存储于享元对象内部,而外部状态则应该由客户端来考虑
享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。
自己写了一版享元模式的代码,利用抽象基类,结合工厂来操作
# -*- 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())
上面的代码运行你会发现实际上生成的类对象只有三个,因为在工厂类中我们避免了重复构造多余的对象,充分利用了现有的对象避免重复的操作。