原型模式 vs 享元模式

5
我开始学习设计模式。我了解到原型模式是用于创建现有对象的精确副本,而享元模式则是用于创建相似对象。
我已经用Java编写了像马里奥一样的2D平台游戏。有很多敌人,它们都相同,唯一的区别是它们的位置[x,y]。还有从大量矩形构建的墙壁,唯一的区别也是它们的位置[x,y]。
在这种特定情况下使用这些设计模式明智吗?我应该使用原型来通过可克隆实现克隆对象,然后设置[x,y]吗?
当我需要新对象时,使用享元更好吗-我只需从哈希映射中返回它们,然后设置[x,y]?
在这两种情况下,我都避免使用new运算符,但我不确定应该使用哪一个。
2个回答

7
您有点误解了。 Prototype 用于创建新实例,Flyweight 用于允许实例共享。
虽然不是最好的示例,但从游戏方面来看,Prototype 意味着您拥有一个 EnemyPrototype(或多个),并从中创建一个新敌人。在天真的实现中,这将复制所有数据,包括图形。因此,对于100个敌人,您会在内存中有相同的图像100次(这不是一个好事)。
至于Flyweight,则可以共享图形。这并不是一个非常好的 Flyweight 模式示例,因为可以更容易地解决它,而无需使用此模式(只需从映射或工厂等获取图像的引用)。
至于避免使用 new 运算符,没有必要。使用 clone() 而不是 new 没有优势,而且还存在一些缺点。

0

原型模式的出现是为了降低创建成本。由于“克隆”与使用“new”运算符相比没有太大的性能提升(可能由于复制、转换等成本而更糟),真正的收益可能在于在创建过程中摆脱重量级操作(如数据库访问)。

原型模式也带来了(至少对我来说)被克隆对象的“浅层”或“深层”混淆的问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接