python设计模式11-享元模式

1. 享元模式(Flyweight)介绍

UML类图

在这里插入图片描述

角色介绍

  • Flyweight:抽象享元类。
  • ConcreteFlyweight:具体享元类,实现了Flyweight。指定内部状态。
  • UnsharedConcreteFlyweight:非享元类。
  • FlyweightFactory:享元创建工厂类。

优点

减少重复对象,大大节约了系统资源。

缺点

  • 享元模式虽然节约了系统资源,但同时也提高了系统的复杂性,尤其当遇到外部状态和内部状态混在一起时,需要先将其进行分离,才可以使用享元模式。否则,会引起逻辑混乱或业务风险;
  • 享元模式中需要额外注意线程安全问题。

使用场景

  • 系统中存在大量的相似对象时,可以选择享元模式提高资源利用率。
  • 需要缓冲池的场景中,可以使用享元模式。如进程池,线程池等技术,就可以使用享元模式(事实上,很多的池技术中已经使得了享元模式)。

2. 示例

"""Flyweight Pattern with Python Code
"""

from abc import abstractmethod, ABCMeta


# 抽象享元类
class Flyweight(metaclass=ABCMeta):
    @abstractmethod 
    def operation(self):
        pass


# 具体享元类,实现了Flyweight
class ConcreteFlyweight(Flyweight):
    def __init__(self, name):
        self.name = name

    def operation(self):
        print("Name: %s" % self.name)


# 享元创建工厂类
class FlyweightFactory():
    _dict = {}

    def getFlyweight(self, name):
        if name not in self._dict:
            self._dict[name] = ConcreteFlyweight(name)
        return self._dict[name]
    
    def getFlyweightCount(self):
        return len(self._dict)


class Client(object):
    def main(self):
        factory = FlyweightFactory()

        c1_capp = factory.getFlyweight("cappuccino")
        c1_capp.operation()

        c2_mocha = factory.getFlyweight("mocha")
        c2_mocha.operation()
        
        c3_capp = factory.getFlyweight("cappuccino")
        c3_capp.operation()

        print("Num of Flyweight Instance: %s" % factory.getFlyweightCount())


if __name__=="__main__":
    Client().main()

输出:

# ./Flyweight.py
Name: cappuccino
Name: mocha
Name: cappuccino
Num of Flyweight Instance: 2

参考:
https://blog.csdn.net/qq_17513503/article/details/88962622
https://www.cnblogs.com/ITyannic/p/12439495.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章