2015-08-22 13 views
5

Ich beginne, Design-Muster zu lernen. Ich verstehe, dass der Prototyp eine exakte Kopie eines Objekts ist, das ich bereits habe, und Flyweight zum Erstellen ähnlicher Objekte dient.Prototyp vs Fliegengewicht

Ich habe 2D-Platformer-Spiel wie Mario programmiert (in Java). Es gibt viele Feinde, die gleich sind, der einzige Unterschied ist ihre Position [x,y]. Es gibt auch Wände, die aus einer großen Anzahl von Rechtecken aufgebaut sind und der einzige Unterschied ist ihre Position [x,y].

Ist es ratsam, einige dieser Entwurfsmuster in dieser speziellen Situation zu verwenden? Sollte ich einen Prototyp verwenden, um Objekte über klonable zu klonen und dann [x,y] setzen?

Ist es besser, Fliegengewicht zu verwenden - wenn ich ein neues Objekt brauche, gebe ich es einfach von meiner hashmap zurück und setze dann [x, y]?

In beiden Szenarien vermeide ich die Verwendung neuer Operator, aber ich bin mir nicht sicher, welche zu verwenden.

Antwort

6

Sie haben es ein bisschen falsch. Prototype wird zum Erstellen neuer Instanzen verwendet, Flyweight wird zum Freigeben von Instanzen verwendet.

Nicht das beste Beispiel, aber Spiel weise Prototype würde bedeuten, dass Sie eine EnemyPrototype (oder mehrere) haben und Sie einen neuen Feind daraus erstellen. In einer naiven Implementierung würde dies alle Daten, einschließlich der Grafiken, duplizieren. Also für 100 Feinde hätte man dasselbe Bild 100 Mal im Gedächtnis (keine gute Sache).

Wie für Flyweight, würden Sie die Grafiken teilen. Nicht wirklich ein sehr gutes Beispiel für Flyweight Muster, da es leichter gelöst werden kann, ohne ein solches Muster zu benötigen (einfach den Verweis auf das Bild von einer Karte oder Fabrik oder was auch immer).

Um den Operator new zu vermeiden, gibt es keine Notwendigkeit. Es gibt keinen Vorteil bei der Verwendung von clone() über new, sondern es gibt einige Nachteile.

0

Prototyp entstand, um die Entwicklungskosten zu reduzieren. Da "Klonen" nicht viel von einem Leistungsgewinn gegenüber dem Verwenden eines "neuen" Operators ist (möglicherweise aufgrund von Kopier-, Casting- und ähnlichen Kosten noch schlimmer), liegt der wahre Gewinn wahrscheinlich darin, schwere Operationen (wie den DB-Zugriff) zu beseitigen Schaffung.

Prototyp bringt auch (zumindest für mich) die Verwirrung von "flach" oder "tief" für geklonte Objekte.

In Ihrem Fall denke ich, teilen die Grafik durch Flyweight ist klug und ich würde für ein anderes Flyweight oder Object Pool für das Master-Objekt gehen.