Как шаблон дизайна в полулегком поддерживает различные объекты? - PullRequest
1 голос
/ 08 января 2012

(я нашел этот пример при чтении мухи)
давайте предположим, что в игре есть объект под названием «воин», и этот объект отличается только своим местоположением
, теперь мой вопрос
, если яиспользуйте шаблон «легкий вес» на этом объекте, я могу попросить солдата много раз получить во время игры, и я хочу, чтобы у каждого солдата было свое местоположение.
как я могу справиться с этим?

Ответы [ 2 ]

4 голосов
/ 09 января 2012

Да, я согласен с patheros ... но я хотел бы отметить, что стимул использовать шаблон Flyweight не требует какой-либо дополнительной структуры классов.Стимулом является то, что с помощью шаблона Flyweight вы минимизируете использование общих / тяжелых ресурсов.

Предположим, что все солдаты используют одинаковое графическое представление.Вместо того, чтобы каждый солдат создавал графические данные (т. Е. Какой-то общий «тяжелый» аспект вашей реализации), вы создаете один «шаблонный» объект, который используется всеми солдатами.

class SharedSoldierData {
  /** UI representation, big, and common to all. */
  byte[] bitmap;
}

class Soldier {
  int x,y;

  void doMovement(SharedSoldierData extraData) {
    // In order to move, this method needs the 'UI' information (a bitmap), which must be provided.
  }
} 

// example usage:
SharedSoldierData soldierType = new SharedSoldierData(...); // setup with the soldiers bitmap
Soldier soldier1 = new Soldier();
Soldier soldier2 = new Soldier();

// modify the solider x/y locations as the game progresses...

soldier1.doMovement(soldierType); // move soldier 1
soldier2.doMovement(soldierType); // ditto for soldier 2.

У вас будет толькоодин экземпляр класса SharedSoldierData (один экземпляр тяжелого ресурса; в данном случае растровое изображение), но у вас может быть несколько экземпляров класса Soldier.Солдат не может «ничего делать», если ему не предоставлен доступ к тяжелым ресурсным данным ...

1 голос
/ 09 января 2012

Скороговорка с дизайном в виде мухи была бы полезна, если бы все солдаты содержали кучу общих данных.Например, допустим, у вас есть солдаты и гражданские лица.Каждый из них имеет разные значения maxHP, attackSpeed ​​и урон, но все солдаты имеют эти атрибуты.В этом случае вы могли бы сделать:

class UnitTemplate {
    String name;
    int maxHP;
    int attackSpeed;
    int damage;
}

class Unit{
    UnitTemplate template;
    int x;
    int y;
}

Было бы 2 экземпляра UnitTemplate: один для типа солдат и один для гражданского типа.Может быть любое количество экземпляров юнитов, и каждый из них будет указывать либо на солдатский юнит-шаблон, либо на гражданский юнит-шаблон.

...