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   
    }
È stato utile?

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:

http://www.oodesign.com/singleton-pattern.html

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

Vedi anche Singleton

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top