在Flyweight模式中将静态实例分配给非静态实例

时间:2011-10-18 01:33:22

标签: java design-patterns static flyweight-pattern

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

编辑:

方法SoldierClient 它说

  

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

为什么这不会影响在课程moveSoldier()

中创建的所有对象
WarGame

3 个答案:

答案 0 :(得分:3)

SoldierClient不包含SOLDIER副本,它包含引用SOLDIER每个 SoldierClient都包含对相同 SOLDIER的引用。

回答编辑

每个士兵的位置都保存在SoldierClient个实例(currentLocationXcurrentLocationY属性中)。这些属性的代码注释也拼写出来:“此状态由客户端维护”(即“此状态未在SoldierImp实例中维护”)。

所有内容都在moveSoldier的参数中:没有SoldierImp实例状态。可以把它想象成静态实用方法。坐标由SoldierClient实例提供;它们永远不会被SoldierImp存储 - 只是用过。

答案 1 :(得分:1)

正如文件所述:

  

解决方案是让士兵的共同状态保持共享   对象

实际上每个SolderClient都有对SOLDIER的引用而不是副本。在每个SolderClient中,变量士兵士兵仅对一个对象进行参考,对所有客户端都是相同的。

由于Flyweight模式使用Singleton模式,您可以先检查它:

http://www.oodesign.com/singleton-pattern.html

答案 2 :(得分:1)

每个SoldierClient实例都有一个引用到Soldier对象。在这种情况下,它们都指向同一个实例。您会注意到,对于每次调用SoldierFactory,都返回相同的Soldier对象 - 只有一个叫Soldier的构造函数。

另见Singleton