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

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