【问题标题】: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。