5

我开始学习设计模式。我知道原型是用来制作我已经拥有的对象的精确副本,而享元是用来制作类似的对象。

我已经编写了 2D 平台游戏,例如马里奥(Java)。有很多相同的敌人,唯一的区别是他们的位置[x,y]。还有由大量矩形建造的墙壁,唯一的区别是它们的位置[x,y]

在这种特殊情况下使用其中一些设计模式是否明智?我应该使用原型通过可克隆然后设置来克隆对象[x,y]吗?

使用享元是否更好 - 当我需要新对象时,我只需从我的哈希图中返回它们,然后设置 [x,y]?

在这两种情况下,我都避免使用 new 运算符,但我不确定使用哪一个。

4

2 回答 2

7

你有点误会了。Prototype用于创建新实例,Flyweight用于允许共享实例。

不是最好的例子,但游戏方面Prototype意味着你有一个EnemyPrototype(或几个)并且你从中创造了一个新的敌人。在一个简单的实现中,这将复制所有数据,包括图形。因此,对于 100 个敌人,您将在内存中拥有 100 次相同的图像(这不是一件好事)。

至于Flyweight,您将共享图​​形。对于模式来说,这并不是一个很好的例子Flyweight,因为不需要这样的模式就可以更容易地解决它(只需从地图或工厂或其他任何地方获取对图像的引用)。

至于避开new运营商,就没有必要了。clone()使用over没有优势new,反而有一些劣势。

于 2015-08-22T07:39:53.367 回答
0

原型出现以降低创建成本。因为,与使用“新”运算符相比,“克隆”并没有太大的性能提升(由于复制、强制转换等成本可能会更糟),真正的收益可能是在期间摆脱繁重的操作(如数据库访问)创建。

原型也带来(至少对我来说)克隆对象的“浅”或“深”的混淆。

在您的情况下,我认为通过享元共享图像图形是明智的,我会为主对象选择另一个享元或对象池。

于 2017-03-27T21:05:09.350 回答