📜  享元法Python设计模式(1)

📅  最后修改于: 2023-12-03 15:06:23.565000             🧑  作者: Mango

享元法Python设计模式

简介

享元法是一种结构型设计模式。该模式的主要思想是共享对象,以减少创建和销毁对象的次数,从而提高程序的性能和效率。

实际上,对象是根据自己固有的属性创建的,但是某些属性是可以共享的。因此,享元法将对象分为内部状态和外部状态两类。内部状态是可以共享的,而外部状态是不可共享的。

内部状态是不可变的,即在对象被创建之后不会再发生变化,同时这些属性是有限的。因此,我们可以使用缓存技术来共享这些内部状态,并且多个对象可以引用同一内部状态。

外部状态是可变的,即在对象被创建之后会发生变化。因此,每个对象都必须维护自己的外部状态。但是,由于内部状态是共享的,因此可以大大减少对象的数量。

优点
  • 减少内存占用,提高程序性能和效率;
  • 提高程序的可维护性;
  • 易于扩展和修改。
缺点
  • 增加了系统的复杂性;
  • 需要对内部状态和外部状态进行正确的分类,否则可能会导致系统错误。
适用场景
  • 大量重复的对象;
  • 对象的数量很大,但是可以把它们分为内部状态和外部状态两类;
  • 对象的许多属性都可以变为外部状态。
代码实现

以下是一个简单的例子,展示了如何使用享元法模式来创建和共享对象。

class FlyweightFactory:
    '''
    享元工厂
    '''
    flyweights = {}

    def get_flyweight(self, key):
        '''
        获取flyweight实例
        '''
        if key not in self.flyweights:
            self.flyweights[key] = ConcreteFlyweight(key)
        return self.flyweights[key]


class Flyweight:
    '''
    享元基类
    '''

    def operation(self, extrinsic_state):
        pass


class ConcreteFlyweight(Flyweight):
    '''
    具体享元类
    '''

    def __init__(self, key):
        self.key = key

    def operation(self, extrinsic_state):
        print(f"ConcreteFlyweight with key {self.key} and extrinsic state {extrinsic_state}")


class Client:
    '''
    客户端
    '''

    def __init__(self):
        self.flyweight_factory = FlyweightFactory()

    def main(self):
        flyweight1 = self.flyweight_factory.get_flyweight('a')
        flyweight1.operation('extrinsic_state1')

        flyweight2 = self.flyweight_factory.get_flyweight('a')
        flyweight2.operation('extrinsic_state2')

        flyweight3 = self.flyweight_factory.get_flyweight('b')
        flyweight3.operation('extrinsic_state3')


if __name__ == '__main__':
    client = Client()
    client.main()

在上面的例子中,我们首先定义了一个享元工厂类FlyweightFactory,该类负责创建和管理所有的共享对象。在get_flyweight方法中,如果对象不存在,则创建新的对象;否则,返回现有的对象。

然后,我们定义了一个抽象的享元类Flyweight,该类定义了一个operation方法,该方法接收外部状态作为参数。具体的享元类ConcreteFlyweight继承自Flyweight类,实现operation方法,并且定义了自己的内部状态。

最后,我们创建了一个客户端类Client,该类使用享元工厂来创建和共享对象。在main方法中,我们创建了三个不同的外部状态对象,分别传递给不同的内部状态对象。