Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 原型与飞锤_Performance_Oop_Design Patterns_Flyweight Pattern_Prototype Pattern - Fatal编程技术网

Performance 原型与飞锤

Performance 原型与飞锤,performance,oop,design-patterns,flyweight-pattern,prototype-pattern,Performance,Oop,Design Patterns,Flyweight Pattern,Prototype Pattern,我开始学习设计模式。我知道原型是为了制作一个我已经拥有的物体的精确副本,而Flyweight是为了制作类似的物体 我已经编写了2D平台游戏,比如Mario(Java)。有很多相同的敌人,唯一的区别是他们的位置。还有一些墙是用大量的矩形建造的,唯一的区别是它们的位置[x,y] 在这种特殊情况下使用这些设计模式是否明智?我是否应该使用prototype通过cloneable克隆对象,然后设置[x,y] 使用flyweight是否更好?当我需要新对象时,我只需从hashmap返回它们,然后设置[x,y

我开始学习设计模式。我知道原型是为了制作一个我已经拥有的物体的精确副本,而Flyweight是为了制作类似的物体

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

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

使用flyweight是否更好?当我需要新对象时,我只需从hashmap返回它们,然后设置[x,y]


在这两种情况下,我都避免使用new操作符,但我不确定该使用哪种操作符。

您的操作有点错误
Prototype
用于创建新实例,
Flyweight
用于允许共享实例

这不是最好的例子,但从游戏角度看,原型将意味着你有一个
EnemyPrototype
(或多个),并由此创建一个新的敌人。在一个简单的实现中,这将复制所有数据,包括图形。因此,对于100个敌人,你会在内存中有100次相同的图像(这不是一件好事)

至于
Flyweight
,您可以共享图形。对于
Flyweight
pattern来说,这并不是一个很好的例子,因为不需要这样的pattern(只需从地图或工厂或其他地方获取图像的参考)就可以轻松解决这个问题


至于避免使用
新的
操作符,没有必要。使用
clone()
比使用
new
没有任何优势,而是存在一些缺点。

原型的出现是为了降低创作成本。由于与使用“新”操作符相比,“克隆”并没有多大的性能提升(可能由于复制、转换等成本而更糟),因此真正的提升可能是在创建过程中摆脱繁重的操作(如db访问)

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

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