原型与Flyweight

时间:2015-08-22 07:21:57

标签: performance oop design-patterns

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

我编写了像Mario(Java)中的2D平台游戏。有许多敌人是相同的,唯一的区别是他们的位置[x,y]。还有从大量矩形建造的墙壁,唯一的区别是它们的位置[x,y]

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

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

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

2 个答案:

答案 0 :(得分:7)

你有点不对劲。 input()用于创建新实例,if($x == '' ||$y == '' || $z=='' || $c=='' || $v==''){ echo "* required all fields"; }else{ 用于允许共享实例。

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

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

至于避免使用Flyweight运算符,则没有必要。使用Flyweight优于new没有优势,而是有一些缺点。

答案 1 :(得分:0)

原型出现以降低创造成本。自从,克隆'与使用' new'相比,性能没有太大提升。运算符(由于复制,转换等成本可能更糟糕),真正的好处可能是在创建过程中摆脱繁重的操作(如数据库访问)。

Prototype也带来了(至少对我而言)“浅浅”的困惑。或者' deep'对于克隆的对象。

在你的情况下,我认为通过Flyweight共享图像图形是明智的,我会为主对象寻找另一个Flyweight或Object Pool。