2015-08-22 19 views
5

Inizio a conoscere i modelli di progettazione. Capisco che il prototipo è per fare una copia esatta di un oggetto che ho già e Flyweight è per creare oggetti simili.Prototipo vs peso vivo

Ho programmato giochi di piattaforme 2D come Mario (in Java). Ci sono molti nemici che sono gli stessi, l'unica differenza è la loro posizione [x,y]. Ci sono anche muri che sono costruiti da un enorme numero di rettangoli e ancora una volta l'unica differenza è la loro posizione [x,y].

È consigliabile utilizzare alcuni di questi schemi di progettazione in questa particolare situazione? Devo usare il prototipo per clonare oggetti tramite clonabile e quindi impostare [x,y]?

È meglio usare il flyweight: quando ho bisogno di un nuovo oggetto, li restituisco dalla mia hashmap e quindi ho impostato [x, y]?

In entrambi gli scenari evito di utilizzare un nuovo operatore ma non sono sicuro quale utilizzare.

risposta

6

Hai sbagliato un po '. Prototype viene utilizzato per creare nuove istanze, Flyweight viene utilizzato per consentire la condivisione di istanze.

Non è il migliore esempio, ma per gioco è il Prototype significherebbe che si dispone di uno EnemyPrototype (o più) e si crea un nuovo nemico da quello. In un'implementazione ingenua questo duplicherebbe tutti i dati, inclusa la grafica. Quindi per 100 nemici avresti la stessa immagine 100 volte in memoria (non una buona cosa).

Per quanto riguarda Flyweight, si condivide la grafica. Non è proprio un ottimo esempio per il modello Flyweight, poiché può essere risolto più facilmente senza alcuna necessità di tale modello (basta ottenere il riferimento all'immagine da una mappa o da una fabbrica o altro).

Come per evitare l'operatore new, non ce n'è bisogno. Non c'è alcun vantaggio nell'uso di clone() su new, piuttosto ci sono alcuni svantaggi.

0

Prototipo emerso per ridurre i costi di creazione. Dato che la "clonazione" non è un guadagno in termini di prestazioni rispetto all'utilizzo di un "nuovo" operatore (potrebbe essere anche peggiore a causa dei costi di copia, incisione, ecc.), Il vero guadagno è probabilmente nel liberarsi da operazioni pesanti (come l'accesso a db) durante creazione.

Il prototipo porta anche (almeno a me) la confusione di essere "superficiale" o "profondo" per gli oggetti clonati.

Nel tuo caso, penso che la condivisione della grafica dell'immagine tramite Flyweight sia saggia e che utilizzerei un altro Flyweight o Object Pool per l'oggetto master.