这是它的定义:
使用共享可以有效地支持大量细粒度对象.
但我无法弄清楚它究竟意味着什么.
你能用一个小小的演示来详细说明吗?
有没有办法使用具有休眠持久性映射的Flyweight对象?我的数据模型包含许多相同的对象.我不想为每个相同的对象设置单独的实例,而是使用Flyweight设计模式并始终引用相同的物理对象.如何在hibernate中实现这一点?
顺便说一句.所有JVM都以某种方式优化字符串的使用,这样当多次使用相同的字符串时,它总是相同的物理实例?
也许有一个简单的方法,我没有看到,所以希望有人可以向我解释.
假设我有一节课:
class A {
public:
const double parameter;
const std::string name;
const std:: string fileName;
A(const double parameter, const std::string name, const std::string fileName) :
parameter(parameter), name(name), fileName(fileName) {};
};
Run Code Online (Sandbox Code Playgroud)
那个类的生成器是:
class AReader {
public:
ifstream dataFile;
AReader(const std::string filename);
A* readObject(const std::string objectName);
};
Run Code Online (Sandbox Code Playgroud)
我想boost::flyweight用来处理这些A对象,因为它们可能有数百万个引用,实际上它们包含大量数据.他们将在哈希name和fileName在一起.
我需要做什么才能做到这一点?我需要boost::flyweight调用AReader.readObject并散列/存储生成的A类.
是否AReader需要成为一个完整的工厂并用作定制工厂?或者是否可以使用flyweight中的默认工厂并以某种方式用于AReader生成A实例(而不是实现工厂所需的整个存储模式),可能通过使AReader实例成为flyweight中的某个参数?或者是否可以const从外部数据源获取公共变量(即,一旦设置,它们不会更改)而无需诉诸第二类?
编辑
我也对不使用Boost的其他建议持开放态度.我当然可以编写我自己的flyweight实现,或任何其他模式,如果一个更适合.但如果我可以使用已经存在的东西,那将是最好的.无论什么最小化我需要编写的代码量,因为一如既往,截止日期很短.
我正在研究一个问题,我正在实例化一个对象的许多实例.大多数情况下,实例化的对象是相同的.为了减少内存开销,我想让所有相同的对象指向同一个地址.但是,当我修改对象时,我想要创建一个新实例 - 基本上是写时复制行为.在Python中实现这一目标的最佳方法是什么?
Flyweight模式很接近.一个例子(来自http://codesnipers.com/?q=python-flyweights):
import weakref
class Card(object):
_CardPool = weakref.WeakValueDictionary()
def __new__(cls, value, suit):
obj = Card._CardPool.get(value + suit, None)
if not obj:
obj = object.__new__(cls)
Card._CardPool[value + suit] = obj
obj.value, obj.suit = value, suit
return obj
Run Code Online (Sandbox Code Playgroud)
其行为如下:
>>> c1 = Card('10', 'd')
>>> c2 = Card('10', 'd')
>>> id(c1) == id(c2)
True
>>> c2.suit = 's'
>>> c1.suit
's'
>>> id(c1) == id(c2)
True
Run Code Online (Sandbox Code Playgroud)
期望的行为是:
>>> c1 = Card('10', 'd')
>>> c2 = Card('10', 'd') …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一个flyweight模式实现,并在达到Google搜索的第20页后放弃了.虽然有无数愚蠢的例子,但似乎没有人发表过Java中可重用的实现.
对我来说,如果你必须保留很多这样的实例,flyweight真的才有意义,所以它必须作为一个集合来实现.我想要的是一个Factory,它接受一个byte/short/int/long 映射器实现,并返回一个List,Set或Map,它看起来像一个普通的Object集合,但是在内部将它的数据存储为一个原语数组,从而节省了很多公羊.映射器将采用类型为X的对象,并将其映射到基元,或者以相反的方式执行.
在某个地方有类似的东西吗?
[编辑]我正在寻找一个支持这种模式的Collection库,而不仅仅是任何一个例子,其中有数百个.
我正在尝试用Java创建一个flyweight对象.我在Objective-C中使用了类似的概念(Objective-C中的Singleton类//我相信它们是相同的东西).
我想在网上找到一个教程或一个例子或解释,以了解如何创建一个flyweight对象并使用它,但我在谷歌上搜索,我找不到任何血统.我浏览了10页,他们基本上都是从一个网站抄袭,这个网站只是解释了这个概念.我理解这个概念 - 我需要一些东西来帮助我/教我如何用Java实现它.
任何人都有任何建议/教程?
谢谢!
在我的理解中,flyweight模式的目的是通过共享共同的外在状态来减少内存占用并提高性能.为什么有人更愿意在静态字段中存储共享状态来实现模式?
请考虑以下示例:http://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html

如果我是对的,那么本例中的要点是通过保持对单个SoldierImp对象的引用来共享SoldierClient类的所有实例之间的公共状态(soldierGraphicalRepresentation对象).
为什么我会为实施这个设计而烦恼?我很想宣布SoldierClient类如下:
public class SoldierClient implements Soldier
{
protected static Object soldierGraphicalRepresentation;
private int currentLocationX;
private int currentLocationY;
static SoldierImp()
{
soldierGraphicalRepresentation = LoadGraphicalRepresentation();
}
public void moveSoldier(int previousLocationX, int previousLocationY, int newLocationX, int newLocationY) {
// do stuff with the graphical representation
}
}
Run Code Online (Sandbox Code Playgroud)
这样,SoilderClient的所有实例共享对同一个士兵图形表示对象的引用,并实现相同的目标.我错了吗?
字符串已经在使用Flyweight设计模式.汇集常见的String对象是否有益/高效.因为字符串将从字符串池中拉出来?
我了解了Flyweight设计模式,并了解它存储了可以共享的对象,从而节省了堆的使用。Java缓存还保存了以后可以重用的对象,以节省内存。那么Flyweight设计模式和Java缓存之间的真正区别是什么?