Assegnare le istanze statiche a quelle non statici nel modello mosca
-
22-10-2019 - |
Domanda
stavo passando il codice di esempio mosca al http: / /www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html e chiedendosi come funziona davvero quando assegniamo un'istanza statica (SOLDIER
come nel sito di cui sopra) per un soldato non statico esempio nel SoldierClient
abbiamo davvero a ridurre le dimensioni dell'oggetto poiché ogni SoldierClient
in qualche modo tenere una copia di un'istanza SOLDIER
in ogni oggetto SoldierClient
creiamo?
EDIT:
Nel metodo moveSoldier()
si dice
// rappresentazione soldato di eliminazione dalla posizione precedente
// quindi rendere la rappresentazione soldato nella nuova posizione
Come mai questo non pregiudica tutti gli oggetti creati in classe WarGame
package flyweight;
public class SoldierImp implements Soldier {
/**
* Intrinsic State maintained by flyweight implementation
* Solider Shape ( graphical represetation)
* how to display the soldier is up to the flyweight implementation
*/
private Object soldierGraphicalRepresentation;
/**
* Note that this method accepts soldier location
* Soldier Location is Extrinsic and no reference to previous location
* or new location is maintained inside the flyweight implementation
*/
public void moveSoldier(int previousLocationX, int previousLocationY,
int newLocationX, int newLocationY) {
// delete soldier representation from previous location
// then render soldier representation in new location
}
Soluzione
Un SoldierClient
non in possesso di un copiare di SOLDIER
, detiene una di riferimento per SOLDIER
, e tutti SoldierClient
contiene un riferimento alla stesso SOLDIER
.
Rispondendo alla modifica
posizione di ogni soldato è tenuto in casi SoldierClient
(currentLocationX
e currentLocationY
proprietà). I commenti del codice per le proprietà precisare che fuori pure: "Questo stato viene mantenuto da parte del cliente" (vale a dire, "questo stato non viene mantenuto nell'istanza SoldierImp
")
Tutto è nei parametri di moveSoldier
: non c'è stato dell'istanza SoldierImp
. Pensate a come un metodo di utilità statico. Le coordinate sono fornite dal dell'istanza SoldierClient
; stanno mai memorizzati dal SoldierImp
-. appena usato
Altri suggerimenti
Come la documentazione cita:
La soluzione è quello di mantenere lo stato comune di soldati in un condiviso oggetto
In realtà ogni SolderClient ha un riferimento a soldato non una copia. In ogni SolderClient la variabile Soldier Soldier è referencig solo per una formica oggetto è la stessa per tutti i clienti.
Dal modello mosca usa un pattern Singleton forse è possibile controllare in primo luogo:
Ogni istanza SoldierClient ha un riferimento a un oggetto Soldato. In questo caso tutti indicano la stessa istanza. Si noterà che per ogni chiamata al SoldierFactory, lo stesso oggetto viene restituito Soldier -. C'è solo costruttore di un soldato chiamata ??p>
Vedi anche Singleton