我开始学习设计模式。我知道原型用于制作我已经拥有的对象的精确副本,而Flyweight用于制作类似的对象。
我编写了像Mario(Java)中的2D平台游戏。有许多敌人是相同的,唯一的区别是他们的位置[x,y]
。还有从大量矩形建造的墙壁,唯一的区别是它们的位置[x,y]
。
在这种特殊情况下使用这些设计模式是否明智?我应该使用prototype来通过cloneable克隆对象,然后设置[x,y]
吗?
使用flyweight是否更好 - 当我需要新对象时,我只是从我的hashmap返回它们然后设置[x,y]?
在这两种情况下,我都避免使用new运算符,但我不确定使用哪种运算符。
答案 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。