我是非英语母语人士,并试图更好地理解该设计模式,我对命名模式的那个词的起源感兴趣.这个名字有什么动机?
据我所知,flyweight设计模式涉及使用共享支持大量细粒度对象的方法.
但是,我发现的特定单词(轻量级)的定义是指重量小于112磅的拳击类别.
那么,为什么以这种方式调用模式呢?
对不起,如果这看起来很愚蠢,但我真的不知道.
据我所知,对象池是一个创造性的模式,而flyweight是一种结构模式,但实际上我看不出两者之间有很大差异.有人可以向我解释一下这些差异,以及每种方法在实施中有用吗?
如果你有两个String实例,并且它们是相同的,那么在Java中它们将共享相同的内存.这是如何在引擎盖下实施的?
编辑:我的应用程序使用大量的String对象,其中许多是相同的.使用Java String常量池的最佳方法是什么,以避免创建自定义flyweight实现?
意图:
这种模式的目的是使用共享来支持大量具有部分内部状态的对象,其中状态的其他部分可以变化.
对象可以通过静态字段共享状态.
使用flyweight模式和使用静态字段共享大量对象的内部状态有什么区别?
flyweight通过其Factory提供的对象池是flyweight真正的全部内容吗?
Java的String内存池的实现是否遵循flyweight模式?
为什么我有这个疑问,我看到实习生没有涉及外在国家.在GoF我读到内在和外在状态之间应该有一个正确的平衡.但在实习生中,一切都是内在的.
或者我们应该说没有关于属性的严格规则,只是共享对象以减少内存就足以称之为flyweight.
请帮我理解.
我似乎在精神上陷入了Flyweight模式的困境.
首先,假设我有一次性用品DisposableFiddle和工厂FiddleFactory:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在我看来,客户很清楚FiddleFactory工厂声称没有创建小提琴的所有权,并且客户有责任在完成它时处理小提琴.
但是,让我们说我想通过使用Flyweight模式在客户端之间共享小提琴:
public class FiddleFactory
{
private Dictionary<SomethingThatDifferentiatesFiddles, DisposableFiddle> fiddles = new ...;
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns an existing fiddle if a corresponding s is found,
// or a newly created fiddle, after adding it to the dictionary,
// if no corresponding …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行以下操作:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;
boost::flyweight<std::string> foo(name);
map[foo] = foo;
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨:"错误C2665:'boost :: hash_value':17个重载中没有一个可以转换所有的参数类型".
但我已经定义了以下功能:
std::size_t hash_value(const boost::flyweight<std::string> & b)
{
boost::hash<std::string> hasher;
const std::string & str = b.get();
return hasher(str);
}
bool operator==(const boost::flyweight<std::string>& f, const boost::flyweight<std::string> & second)
{
return f.get() == second.get();
}
Run Code Online (Sandbox Code Playgroud)
但它没有编译.
我需要做些什么才能使boost unordered_map支持flyweight?
[编辑]我使用以下代码:
struct flyweight_hash
{
std::size_t operator()(const boost::flyweight<std::string> &elm) const
{
boost::hash<std::string> hasher;
const std::string & str = elm.get();
return hasher(str);
}
};
Run Code Online (Sandbox Code Playgroud)
并将其作为模板参数传递给地图的构造:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> , flyweight_hash > map;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我不明白重载hash_value没有工作的方式.
我的应用程序是多线程的,具有密集的字符串处理.我们正在经历过多的内存消耗,并且分析已经证明这是由于String数据.我认为使用某种flyweight模式实现甚至缓存可以大大节省内存消耗(我知道Strings经常是重复的,尽管我在这方面没有任何硬数据).
我查看了Java Constant Pool和String.intern,但它似乎可能引发一些PermGen问题.
在java中实现应用程序范围的多线程字符串池的最佳替代方法是什么?
编辑:另见我以前的相关问题:java如何实现引擎盖下的字符串的flyweight模式?
Builder Pattern和Flyweight Pattern在使用方面有什么区别,因为它们都处理大量对象?
这是它的定义:
使用共享可以有效地支持大量细粒度对象.
但我无法弄清楚它究竟意味着什么.
你能用一个小小的演示来详细说明吗?