flyweight设计模式如何维护不同的对象?

时间:2012-01-08 12:19:34

标签: java oop design-patterns object flyweight-pattern

(我在阅读flyweight时发现了这个例子)
让我们假设在游戏中有一个名为士兵的对象,这个对象因其位置而异 现在我的问题是,如果我要在这个物体上使用飞重模式,我可能会要求在游戏中多次获得一名士兵,我希望每个士兵都拥有自己的位置。 我该怎么处理?

2 个答案:

答案 0 :(得分:4)

是的,我同意patheros ......但是我想指出一个人使用Flyweight pattern的动机不需要一些额外的类结构。激励是通过使用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 :(得分:1)

如果所有士兵都包含一堆共享数据,那么flyweight设计模式会很有用。例如,假设你有士兵和平民。每个都有不同的maxHP,attackSpeed和damage,但所有士兵都有这些属性。在这种情况下,您可以:

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

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

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