Flyweight模式 - 如何在数据结构中存储flyweights?

时间:2011-04-07 14:34:23

标签: design-patterns flyweight-pattern

GoF书中的经典Flyweight模式实现示例仅将字符代码存储在可共享的“Characters”中,并使用“GlyphContext”将外部状态存储在树结构中。这个例子也提到了行和列,但没有提到如何存储flyweights(“Character”对象)的“集合”。

很明显,此模式允许通过共享实例来避免创建大量对象,但是如何创建此类对象的结构(例如,表示文档)而不创建对缓存对象的引用结构(会使模式的目的无效)?我看到其他示例使用缓存实例作为“丢弃”对象,而不构建任何类型的结构,但这似乎没有任何意义,因为它可以被一组静态操作替换。

如果在创建后需要引用flyweights,那么模式的好处大致可以计算为 [内部状态的大小] / [对象引用的大小] 。这意味着只有1个字段的flyweight没有意义吗?

编辑:我的“内存计算”错了...如果没有flyweights,你需要存储引用,但是使用flyweights,你不再需要存储对象了。这个问题的基本观点似乎仍然有效 - 模式提供的节约程度与内在状态的大小成正比,而不是“逻辑对象”的数量。对或错?

1 个答案:

答案 0 :(得分:0)

是的,如果您将大量使用该对象,即使一个场重量级对象也有意义。获得实例的速度更快,然后制作新对象。

我发现Map <string name, Object yourobject>(在Java中)是存储它们的好方法。为什么你需要“没有结构”?

使用某种结构来存储正在使用的flywieght并不会使模式的目的无效。你需要一些flywieghts实例来使用它们。您可以在运行时创建它们并将它们添加到它们的列表中(这是它应该完成的方式,以避免不需要的对象),或者您可以在运行之前准备它们(使“低”感觉)。