java - 享元设计模式如何维护不同的对象?

标签 java oop design-patterns object flyweight-pattern

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

最佳答案

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

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

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

关于java - 享元设计模式如何维护不同的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777424/

相关文章:

java - 如何使用 OpenAPI 3.0 创建同一请求的多个版本?

java - 如何自动为@SuiteClasses创建列表

php - 如何在父类构造函数中使用命名空间

oop - 哪种设计模式更适合与Controllers/Services/DAO一起使用

java - Swing 中的复合模式

java - 小部件内的 runOnUiThread

java - 我的微调器仅加载列表中的第一个数据(字符串)

java - 接口(interface)实现启动不同的异常

javascript - OOP 和 jQuery : how to init a var with Deferred();

java - 相同的计算流程,但功能不同