标签: flyweight-pattern

Flyweight设计模式名称的原因是什么?

我是非英语母语人士,并试图更好地理解该设计模式,我对命名模式的那个词的起源感兴趣.这个名字有什么动机?

据我所知,flyweight设计模式涉及使用共享支持大量细粒度对象的方法.

但是,我发现的特定单词(轻量级)的定义是指重量小于112磅的拳击类别.

那么,为什么以这种方式调用模式呢?

对不起,如果这看起来很愚蠢,但我真的不知道.

design-patterns flyweight-pattern

21
推荐指数
1
解决办法
1098
查看次数

Flyweight vs对象池模式:什么时候有用?

据我所知,对象池是一个创造性的模式,而flyweight是一种结构模式,但实际上我看不出两者之间有很大差异.有人可以向我解释一下这些差异,以及每种方法在实施中有用吗?

design-patterns objectpool flyweight-pattern

21
推荐指数
2
解决办法
4769
查看次数

java如何在引擎盖下实现字符串的flyweight模式?

如果你有两个String实例,并且它们是相同的,那么在Java中它们将共享相同的内存.这是如何在引擎盖下实施的?

编辑:我的应用程序使用大量的String对象,其中许多是相同的.使用Java String常量池的最佳方法是什么,以避免创建自定义flyweight实现?

java design-patterns flyweight-pattern

17
推荐指数
4
解决办法
1万
查看次数

了解Flyweight模式

意图:

这种模式的目的是使用共享来支持大量具有部分内部状态的对象,其中状态的其他部分可以变化.

对象可以通过静态字段共享状态.

使用flyweight模式和使用静态字段共享大量对象的内部状态有什么区别?

flyweight通过其Factory提供的对象池是flyweight真正的全部内容吗?

c# design-patterns flyweight-pattern

14
推荐指数
2
解决办法
4171
查看次数

Java的字符串实习生是轻量级吗?

Java的String内存池的实现是否遵循flyweight模式?

为什么我有这个疑问,我看到实习生没有涉及外在国家.在GoF我读到内在和外在状态之间应该有一个正确的平衡.但在实习生中,一切都是内在的.

或者我们应该说没有关于属性的严格规则,只是共享对象以减少内存就足以称之为flyweight.

请帮我理解.

java design-patterns flyweight-pattern

12
推荐指数
1
解决办法
4421
查看次数

IDisposable的Flyweight和Factory问题

我似乎在精神上陷入了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)

c# idisposable factory-pattern flyweight-pattern

11
推荐指数
1
解决办法
806
查看次数

如何使boost unordered_map支持flyweight <string>

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

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没有工作的方式.

c++ boost unordered-map flyweight-pattern

10
推荐指数
2
解决办法
1982
查看次数

Java中String Flyweight实现的最佳替代方案

我的应用程序是多线程的,具有密集的字符串处理.我们正在经历过多的内存消耗,并且分析已经证明这是由于String数据.我认为使用某种flyweight模式实现甚至缓存可以大大节省内存消耗(我知道Strings经常是重复的,尽管我在这方面没有任何硬数据).

我查看了Java Constant Pool和String.intern,但它似乎可能引发一些PermGen问题.

在java中实现应用程序范围的多线程字符串池的最佳替代方法是什么?

编辑:另见我以前的相关问题:java如何实现引擎盖下的字符串的flyweight模式?

java string memory-management pool flyweight-pattern

9
推荐指数
1
解决办法
5712
查看次数

Builder Pattern和Flyweight Pattern有什么区别?

Builder Pattern和Flyweight Pattern在使用方面有什么区别,因为它们都处理大量对象?

design-patterns builder-pattern flyweight-pattern

8
推荐指数
2
解决办法
2120
查看次数

如何在PHP中实现flyweight模式?

这是它的定义:

使用共享可以有效地支持大量细粒度对象.

但我无法弄清楚它究竟意味着什么.

你能用一个小小的演示来详细说明吗?

php oop design-patterns flyweight-pattern

8
推荐指数
1
解决办法
1510
查看次数