Вопрос

Я проходил образец в полусреднем весе в http://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html И интересно, как это действительно работает, когда мы назначаем статический экземпляр (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   
    }
Это было полезно?

Решение

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

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

Расположение каждого солдата проводится в SoldierClient случаи (currentLocationX а также currentLocationY характеристики). Код комментирует эти свойства также изложены: «Это состояние поддерживается клиентом» (то есть, «это состояние не поддерживается в SoldierImp пример").

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

Другие советы

Как упоминается в документации:

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

На самом деле у каждого Solderclient есть ссылка на солдата, а не копию. В каждом проданном Солдат ссылается только на один объект муравей, он одинаков для всех клиентов.

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

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

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

Смотрите также Синглтон

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top