0

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

编辑:

moveSoldier() 它说的方法中

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

为什么这不会影响类中创建的所有对象WarGame

package flyweight;

public class SoldierImp implements Soldier {

    /**
     * Intrinsic State maintained by flyweight implementation
     * Solider Shape ( graphical represetation)
     * how to display the soldier is up to the flyweight implementation
     */
    private Object soldierGraphicalRepresentation;

    /**
     * Note that this method accepts soldier location 
     * Soldier Location is Extrinsic and no reference to previous location 
     * or new location is maintained inside the flyweight implementation
     */
    public void moveSoldier(int previousLocationX, int previousLocationY,
            int newLocationX, int newLocationY) {

        // delete soldier representation from previous location 
        // then render soldier representation in new location   
    }
4

3 回答 3

3

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

回复编辑

每个士兵的位置都保存在SoldierClient实例(currentLocationXcurrentLocationY属性)中。这些属性的代码注释也说明了这一点:“此状态由客户端维护”(即,“此状态不在SoldierImp实例中维护”)。

一切都在moveSoldier's 参数中:没有SoldierImp实例状态。把它想象成一个静态实用程序方法。坐标由SoldierClient实例提供;它们永远不会被SoldierImp--just used 存储。

于 2011-10-18T01:41:38.310 回答
1

正如文档所述:

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

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

由于享元模式使用单例模式,也许你可以先检查一下:

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

于 2011-10-18T01:41:49.313 回答
1

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

另请参阅单例

于 2011-10-18T01:45:06.490 回答