1. 人人编程首页
  2. 架构设计

享元设计模式

 

意图

  • 使用共享有效地支持大量细粒度对象。
  • 用轻量级小工具替换重量级小部件的 Motif GUI 策略。

问题

将对象设计到系统“粒度”的最低级别提供了最佳的灵活性,但在性能和内存使用方面可能会非常昂贵。

讨论

享元模式描述了如何共享对象以允许以细粒度使用它们而不会产生过高的成本。每个“享元”对象分为两部分:状态相关(外部)部分和状态无关(内部)部分。内在状态存储(共享)在享元对象中。外部状态由客户端对象存储或计算,并在调用其操作时传递给享元。

这种方法的一个例子是被重新设计为轻量级小工具的 Motif 小部件。而小部件足够“智能”,可以独立存在;小工具与其父布局管理器小部件存在依赖关系。每个布局管理器为其享元小工具提供上下文相关的事件处理、不动产管理和资源服务,每个小工具只负责上下文无关的状态和行为。

结构

享元存储在工厂的存储库中。客户限制自己直接创建享元,并向工厂请求它们。每个享元不能独立存在。每当向享元发出请求时,客户端必须提供任何会使共享变得不可能的属性。如果上下文适合“规模经济”(即客户端可以轻松计算或查找必要的属性),那么享元模式提供了适当的杠杆作用。

享元设计模式

、和 类可以是“轻量级的”,因为它们的特定于实例的状态已被解封装或外部化,并且必须由客户端提供AntLocustCockroach

享元设计模式

例子

Flyweight 使用共享来有效地支持大量对象。现代网络浏览器使用这种技术来防止两次加载相同的图像。当浏览器加载一个网页时,它会遍历该页面上的所有图像。浏览器从 Internet 加载所有新图像并将它们放置在内部缓存中。对于已经加载的图像,将创建一个享元对象,它具有一些独特的数据,例如页面内的位置,但其他所有内容都引用到缓存的数据。

享元设计模式

检查清单

  1. 确保对象开销是一个需要注意的问题,并且类的客户能够并且愿意承担责任调整。
  2. 将目标类的状态分为:可共享(内在)状态和不可共享(外在)状态。
  3. 从类属性中删除不可共享状态,并将其添加到受影响方法的调用参数列表中。
  4. 创建一个可以缓存和重用现有类实例的工厂。
  5. 客户端必须使用 Factory 而不是 new 运算符来请求对象。
  6. 客户端(或第三方)必须查找或计算不可共享状态,并将该状态提供给类方法。

经验法则

  • Flyweight 展示了如何制作大量小对象,而 Facade 展示了如何使单个对象代表整个子系统。
  • Flyweight 通常与 Composite 结合来实现共享叶节点。
  • 解释器的抽象语法树中的终端符号可以与享元共享。
  • Flyweight 解释了何时以及如何共享 State 对象。

本文来自转载,原文链接:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注