标签: flyweight-pattern

如何在PHP中实现flyweight模式?

这是它的定义:

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

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

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

php oop design-patterns flyweight-pattern

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

Hibernate和Flyweight

有没有办法使用具有休眠持久性映射的Flyweight对象?我的数据模型包含许多相同的对象.我不想为每个相同的对象设置单独的实例,而是使用Flyweight设计模式并始终引用相同的物理对象.如何在hibernate中实现这一点?

顺便说一句.所有JVM都以某种方式优化字符串的使用,这样当多次使用相同的字符串时,它总是相同的物理实例?

java identity design-patterns hibernate flyweight-pattern

7
推荐指数
1
解决办法
1363
查看次数

具有Boost和外部数据源的Flyweights

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

假设我有一节课:

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对象,因为它们可能有数百万个引用,实际上它们包含大量数据.他们将在哈希namefileName在一起.

我需要做什么才能做到这一点?我需要boost::flyweight调用AReader.readObject并散列/存储生成的A类.

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

编辑

我也对不使用Boost的其他建议持开放态度.我当然可以编写我自己的flyweight实现,或任何其他模式,如果一个更适合.但如果我可以使用已经存在的东西,那将是最好的.无论什么最小化我需要编写的代码量,因为一如既往,截止日期很短.

c++ boost flyweight-pattern boost-flyweight

7
推荐指数
1
解决办法
345
查看次数

Python copy-on-write行为

我正在研究一个问题,我正在实例化一个对象的许多实例.大多数情况下,实例化的对象是相同的.为了减少内存开销,我想让所有相同的对象指向同一个地址.但是,当我修改对象时,我想要创建一个新实例 - 基本上是写时复制行为.在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)

python flyweight-pattern python-2.7

7
推荐指数
1
解决办法
4143
查看次数

Flyweight模式中描述的内在和外在状态之间有什么区别?

Four of Gang中的FlyWeight Pattern 一章开始,FlyWeight模式适用于大多数对象状态可以是外在的.

什么extrinsic state意思?我感觉这个模式用于共享对象.如果要共享对象,那么该对象如何甚至可以具有任何状态?

java design-patterns flyweight-pattern

7
推荐指数
3
解决办法
5112
查看次数

那里有Java flyweight模式实现吗?

我一直在寻找一个flyweight模式实现,并在达到Google搜索的第20页后放弃了.虽然有无数愚蠢的例子,但似乎没有人发表过Java中可重用的实现.

对我来说,如果你必须保留很多这样的实例,flyweight真的才有意义,所以它必须作为一个集合来实现.我想要的是一个Factory,它接受一个byte/short/int/long 映射器实现,并返回一个List,Set或Map,它看起来像一个普通的Object集合,但是在内部将它的数据存储为一个原语数组,从而节省了很多公羊.映射器将采用类型为X的对象,并将其映射到基元,或者以相反的方式执行.

在某个地方有类似的东西吗?

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

java design-patterns flyweight-pattern

6
推荐指数
1
解决办法
1573
查看次数

Java中的Flyweight示例

我正在尝试用Java创建一个flyweight对象.我在Objective-C中使用了类似的概念(Objective-C中的Singleton类//我相信它们是相同的东西).

我想在网上找到一个教程或一个例子或解释,以了解如何创建一个flyweight对象并使用它,但我在谷歌上搜索,我找不到任何血统.我浏览了10页,他们基本上都是从一个网站抄袭,这个网站只是解释了这个概念.我理解这个概念 - 我需要一些东西来帮助我/教我如何用Java实现它.

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

谢谢!

java flyweight-pattern

6
推荐指数
1
解决办法
4369
查看次数

Flyweight模式与静态字段

在我的理解中,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的所有实例共享对同一个士兵图形表示对象的引用,并实现相同的目标.我错了吗?

design-patterns flyweight-pattern

6
推荐指数
1
解决办法
903
查看次数

Flyweight:字符串已经使用字符串池:为Flyweight池化String对象是否有意义?

字符串已经在使用Flyweight设计模式.汇集常见的String对象是否有益/高效.因为字符串将从字符串池中拉出来?

java performance design-patterns flyweight-pattern

5
推荐指数
2
解决办法
525
查看次数

Flyweight设计模式和Java缓存之间有什么区别

我了解了Flyweight设计模式,并了解它存储了可以共享的对象,从而节省了堆的使用。Java缓存还保存了以后可以重用的对象,以节省内存。那么Flyweight设计模式和Java缓存之间的真正区别是什么?

java caching design-patterns flyweight-pattern

5
推荐指数
2
解决办法
1830
查看次数