问题标签 [flyweight-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
351 浏览

boost - 使用 boost::flyweight在 struct T {} 内部(即递归享元)

我正在尝试定义一个不可变的文件路径值类型,利用 boost::flyweight 来共享路径组件。像这样的东西:

当然,这看起来像一个递归结构,但boost::flyweight<T>实际上(本身)并不包含 的副本T,只是一个T可以在适当的持有者中查找的句柄,所以我认为这个结构应该有效。

不幸的是,它无法编译,因为当 g++ 遇到 typedef 时,它会抱怨 filepath_data 不完整。

所以,问题是,我可以利用灵活性和更高级的模板参数boost::flyweight<>来使这个结构工作吗?如果可以,怎么做?

0 投票
2 回答
541 浏览

java - Flyweight:字符串已经使用 String pool:为 Flyweight 池化 String 对象有意义吗?

字符串已经在使用享元设计模式。汇集常见的 String 对象是否有益/有效。由于字符串将已经从字符串池中拉出?

0 投票
1 回答
534 浏览

design-patterns - 享元模式 - 如何在数据结构中存储享元?

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

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

是否可以得出这样的结论:如果在创建享元后需要引用它们,那么该模式的好处可以粗略地计算为[固有状态的大小]/[对象引用的大小]。这意味着只有 1 个字段的享元没有意义?

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

0 投票
2 回答
3995 浏览

design-patterns - Flyweight 模式的一个很好的例子是什么?

c# 中的字符串保留就是一个很好的例子。其他的?

0 投票
6 回答
1699 浏览

java - 那里有任何 Java 享元模式实现吗?

我一直在寻找一种享元模式的实现,并在达到谷歌搜索的第 20 页后放弃了。虽然那里有无数愚蠢的例子,但似乎没有人发布过 Java 中可重用的实现。

对我来说,flyweight 只有在你必须保留许多这样的实例时才有意义,所以它必须作为一个集合来实现。我想要的是一个工厂,它采用字节/短/整数/长映射器实现,并返回一个列表、集合或映射,它看起来像一个普通的对象集合,但在内部将它的数据存储为一个原始数组,从而节省大量内存。映射器将获取一个 X 类型的对象,并将其映射到一个基元,或者以相反的方式进行。

在某处有类似的东西吗?

[编辑] 我正在寻找一个支持这种模式的Collection库,而不仅仅是任何示例,其中有数百个。

0 投票
5 回答
4546 浏览

java - Java中的享元示例

我正在尝试在 Java 中创建一个享元对象。我在 Objective-C 中使用过类似的概念(Objective-C 中的单例类 // 我相信它们是同一回事)。

我正在尝试在线查找教程或示例或解释,以了解如何创建享元对象并使用它,但我在 Google 上搜索过,但找不到任何下降。我浏览了 10 页,它们基本上都抄袭了一个网站,该网站只是解释了这个概念。我理解这个概念——我需要一些东西来帮助我/教我如何在 Java 中实现它。

有人有任何建议/教程吗?

谢谢!

0 投票
3 回答
234 浏览

java - 在享元模式中将静态实例分配给非静态实例

我正在浏览http://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html上的 Flyweight 示例代码,并想知道当我们分配静态实例时它是如何工作的(SOLDIER如上面的网站) 到一个非静态士兵实例中SoldierClient,我们是否真的减小了对象大小,因为每个对象SoldierClient都会以某种方式在我们创建SOLDIER的每个对象中保存一个实例副本?SoldierClient

编辑:

moveSoldier() 它说的方法中

// 从先前位置删除士兵表示
// 然后在新位置渲染士兵表示

为什么这不会影响类中创建的所有对象WarGame

0 投票
2 回答
2126 浏览

c++ - 如何使 boost unordered_map 支持享元

我正在尝试执行以下操作:

但是编译器抱怨:“错误 C2665:'boost::hash_value':17 个重载中没有一个可以转换所有参数类型”。

但我已经定义了以下功能:

但它不编译。

我需要做什么才能使 boost unordered_map 支持享元?

[编辑] 我让它使用以下代码:

并将其作为模板参数传递给地图的构造:

在这种情况下,我不明白重载 hash_value 的方式不起作用。

0 投票
2 回答
957 浏览

java - 享元设计模式如何维护不同的对象?

(我在阅读 flyweight 时发现了这个例子)
让我们假设在游戏中有一个叫做士兵的对象,并且这个对象只是它的位置不同,
现在我的问题是
如果我要在这个对象上使用 flyweight 模式,我可能会问在游戏中多次获得一名士兵,我希望每个士兵都有自己的位置。
我该如何处理?

0 投票
3 回答
372 浏览

c++ - 具有 Boost 和外部数据源的享元

也许有一个我没有看到的简单方法,所以希望有人可以向我解释。

假设我有一堂课:

该类的生成器是:

我想用它boost::flyweight来处理这些A对象,因为可能会有数百万个对它们的引用,实际上它们包含大量数据。它们将被散列name在一起fileName

我需要什么才能完成这项工作?我需要boost::flyweight调用AReader.readObject和散列/存储结果A类。

是否AReader需要成为完整的工厂并用作定制工厂?或者是否可以在享元中使用默认工厂并以某种方式使用AReader来生成A实例(而不是实现工厂所需的整个存储模式),也许可以通过使AReader实例成为享元中某些东西的参数?或者是否可以const从外部数据源获取公共变量(即一旦设置,它们就不会改变)而不求助于第二类?

编辑

我也愿意接受其他不使用 Boost 的建议。我当然可以编写自己的轻量级实现,或者如果有更适合的任何其他模式。但是,如果我可以使用已经存在的东西,那将是最好的。无论什么都能最大限度地减少我需要编写的代码量,因为与往常一样,截止日期很短。