【问题标题】:How flyweight design pattern maintains different objects?享元设计模式如何维护不同的对象?
【发布时间】:2012-01-08 12:19:34
【问题描述】:

(我在阅读flyweight时发现了这个例子)
假设在游戏中有一个名为士兵的物体,而这个物体的不同之处仅在于它的位置
现在我的问题是
如果我要在这个物体上使用享元模式,我可能会在游戏中多次要求获得一名士兵,我希望每个士兵都有自己的位置。
我该如何处理?

【问题讨论】:

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


【解决方案1】:

是的,我同意 patheros...但我想指出,使用 Flyweight pattern 的动机并不需要一些额外的类结构。动机是通过使用享元模式,您可以最大限度地减少对常见/重资源的使用。

假设所有士兵都使用相同的图形表示。不是每个士兵都实例化图形数据(即,您的实现中一些常见的“繁重”方面),而是创建一个由所有士兵共享的“模板”对象。

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 类的实例。除非提供对大量资源数据的访问权限,否则士兵无法“做任何事情”...

【讨论】:

    【解决方案2】:

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

    class UnitTemplate {
        String name;
        int maxHP;
        int attackSpeed;
        int damage;
    }
    
    class Unit{
        UnitTemplate template;
        int x;
        int y;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      相关资源
      最近更新 更多