Присвоение статических экземпляров нестатическим
-
22-10-2019 - |
Вопрос
Я проходил образец в полусреднем весе в 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 есть ссылка на солдата, а не копию. В каждом проданном Солдат ссылается только на один объект муравей, он одинаков для всех клиентов.
Поскольку шаблон в полусреднем весе использует шаблон синглтона, возможно, вы можете сначала проверить его:
Каждый экземпляр SoldierClient имеет ссылка для солдатского объекта. В этом случае они все указывают на один и тот же экземпляр. Вы заметите, что для каждого вызова SoldierFactory тот же объект Soldier возвращается - есть только один конструктор Soldy Soldier.
Смотрите также Синглтон