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