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