Назначение статических экземпляров нестатическим в шаблоне Flyweight - PullRequest
0 голосов
/ 18 октября 2011

Я просматривал пример кода Flyweight на http://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html и удивлялся, как он действительно работает, когда мы присваиваем статический экземпляр (SOLDIER, как на приведенном выше сайте) экземпляру нестатического солдата в SoldierClient действительно ли мы уменьшаем размер объекта, так как каждый SoldierClient будет каким-то образом содержать копию SOLDIER экземпляра в каждом SoldierClient объекте, который мы создаем?

EDIT:

В методе 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   
    }

Ответы [ 3 ]

3 голосов
/ 18 октября 2011

A SoldierClient не содержит копию из SOLDIER, он содержит ссылку до SOLDIER и каждые SoldierClientсодержит ссылку на те же SOLDIER.

Ответ на редактирование

Местоположение каждого солдата сохраняется в SoldierClient случаях (currentLocationX и currentLocationY свойства).Комментарии к коду для этих свойств также объясняют это: «это состояние поддерживается клиентом» (т. Е. «Это состояние не поддерживается в SoldierImp экземпляре»).

Все находится в moveSoldier параметры: нет SoldierImp состояния экземпляра.Думайте об этом как о статическом служебном методе.Координаты предоставляются экземпляром SoldierClient;они никогда не хранятся в SoldierImp - просто используются.

1 голос
/ 18 октября 2011

Каждый экземпляр SoldierClient имеет ссылку на объект солдата.В этом случае все они указывают на один и тот же экземпляр.Вы заметите, что для каждого вызова SoldierFactory возвращается один и тот же объект Soldier - существует только один конструктор Soldier для вызова.

См. Также Singleton

1 голос
/ 18 октября 2011

Как указано в документации:

Решение состоит в том, чтобы сохранять общее состояние солдат в общем объекте

Действительно, каждый SolderClient имеет ссылку на SOLDIER, а некопия.В каждом SolderClient переменная Солдат-солдат ссылается только на один объект и одинакова для всех клиентов.

Поскольку шаблон Flyweight использует шаблон Singleton, возможно, вы можете сначала проверить его:

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

...