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