1

(我在阅读 flyweight 时发现了这个例子)
让我们假设在游戏中有一个叫做士兵的对象,并且这个对象只是它的位置不同,
现在我的问题是
如果我要在这个对象上使用 flyweight 模式,我可能会问在游戏中多次获得一名士兵,我希望每个士兵都有自己的位置。
我该如何处理?

4

2 回答 2

4

是的,我同意 patheros ......但我想指出,使用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 类的实例。除非提供对大量资源数据的访问权限,否则士兵无法“做任何事情”……

于 2012-01-08T21:40:11.097 回答
1

如果所有士兵都包含一堆共享数据,那么享元设计模式将很有用。例如,假设您有士兵和平民。每个人都有不同的最大生命值、攻击速度和伤害,但所有士兵都有这些属性。在这种情况下,您可能会:

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

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

将有 2 个 UnitTemplate 实例,一个用于士兵类型的单位,一个用于平民类型的单位。可以有任意数量的 Unit 实例,每个实例都指向士兵 UnitTemplate 或民用 UnitTemplate。

于 2012-01-08T21:05:35.127 回答