我正在浏览http://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html上的Flyweight示例代码,并想知道当我们将静态实例(如上例网站中的SOLDIER
)分配给{中的非静态士兵实例时,它是如何工作的{1}}我们是否真的减少了对象大小,因为每个SoldierClient
会以某种方式在我们创建的每个SoldierClient
对象中保存SOLDIER
个实例的副本?
编辑:
方法SoldierClient
它说
//从之前的位置删除士兵表示
//然后在新位置渲染士兵表示
为什么这不会影响在课程moveSoldier()
WarGame
答案 0 :(得分:3)
SoldierClient
不包含SOLDIER
的副本,它包含引用到SOLDIER
和每个 SoldierClient
都包含对相同 SOLDIER
的引用。
回答编辑
每个士兵的位置都保存在SoldierClient
个实例(currentLocationX
和currentLocationY
属性中)。这些属性的代码注释也拼写出来:“此状态由客户端维护”(即“此状态未在SoldierImp
实例中维护”)。
所有内容都在moveSoldier
的参数中:没有SoldierImp
实例状态。可以把它想象成静态实用方法。坐标由SoldierClient
实例提供;它们永远不会被SoldierImp
存储 - 只是用过。
答案 1 :(得分:1)
正如文件所述:
解决方案是让士兵的共同状态保持共享 对象
实际上每个SolderClient都有对SOLDIER的引用而不是副本。在每个SolderClient中,变量士兵士兵仅对一个对象进行参考,对所有客户端都是相同的。
由于Flyweight模式使用Singleton模式,您可以先检查它:
答案 2 :(得分:1)
每个SoldierClient实例都有一个引用到Soldier对象。在这种情况下,它们都指向同一个实例。您会注意到,对于每次调用SoldierFactory,都返回相同的Soldier对象 - 只有一个叫Soldier的构造函数。