原型与享元

Prototype vs Flyweight

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

我编写了像马里奥这样的 2D 平台游戏(在 Java 中)。有很多相同的敌人,唯一不同的是它们的位置 [x,y]。还有一些墙是由大量矩形构成的,唯一的区别是它们的位置 [x,y].

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

使用 flyweight 更好吗 - 当我需要新对象时,我只是 return 它们来自我的 hashmap,然后设置 [x,y]?

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

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

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

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

至于避免new运算符,没有必要。使用 clone()new 没有任何优势,而是有一些缺点。

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

原型还带来(至少对我而言)克隆对象是 'shallow' 或 'deep' 的混淆。

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