13、Python - 享元模式
基本介绍
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
特点:运用共享技术有效地支持大量细粒度的对象,用HashMap存储这些对象
该模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
案例图示
当大多数请求都是同一个结果,为每个请求生成一个实例的代价太高。
故只要请求的是同一个结果,我们就将已存在的实例进行返回。
举个例子,我们有一个报表系统,当第一次请求2016年度报表时会生成并存储该报表,以后再次请求2016年度报表时都不会重复生成该报表而是通过查询直接返回。
优缺点
优点:
- 大大减少对象的创建
- 降低系统的内存
缺点:
- 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱
代码实现
用Python实现享元模式:
# 报表系统
class Report:
def __init__(self, year) -> None:
self.year = year
self.desc = "%s report" % year
# 请求报表(享元)
class RequestReport:
def __init__(self) -> None:
self.savaMap = {}
def getReport(self, year):
if not self.savaMap.get(year):
print("generated report")
newReport = Report(year)
self.savaMap[year] = newReport
return self.savaMap[year]
if __name__ == "__main__":
client = RequestReport()
report = client.getReport(2016)
print(report.desc)
仅生成一次
report = client.getReport(2016)
print(report.desc)
# generated report
# 2016 report
# 2016 report