Question

Je traversais l'exemple de code http: / /www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html et je me demandais comment cela fonctionne vraiment quand nous attribuons une instance statique (SOLDIER comme dans le site ci-dessus) à un soldat non statique par exemple dans SoldierClient-nous vraiment réduire la taille de l'objet puisque chaque SoldierClient sera en quelque sorte tenir une copie de l'instance de SOLDIER dans chaque objet SoldierClient nous créons?

EDIT:

Dans le procédé moveSoldier() il est dit

// suppression de la représentation militaire de l'emplacement précédent
// puis rendre la représentation de soldat dans nouvel emplacement

Comment venir cela ne touche pas tous les objets créés en 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   
    }
Était-ce utile?

La solution

A SoldierClient ne tient pas copier de SOLDIER, elle détient une référence à SOLDIER et tous SoldierClient contient une référence à la même SOLDIER.

Répondre à la modifier

L'emplacement de chaque soldat est détenu dans les cas de SoldierClient (propriétés de currentLocationX et currentLocationY). Les commentaires du code pour ces propriétés épellent comme bien. « Cet état est maintenu par le client » (à savoir, « cet état ne se maintient pas dans l'instance de SoldierImp »)

Tout est dans les paramètres de moveSoldier: il n'y a pas d'état d'instance SoldierImp. Pensez-y comme une méthode utilitaire statique. Les coordonnées sont fournies par l'instance de SoldierClient; ils ne sont jamais stockées par le SoldierImp -. juste utilisé

Autres conseils

Comme la documentation mentionne:

La solution est de garder l'état commun des soldats dans une commune objet

Vraiment tous SolderClient a une référence à SOLDAT pas une copie. Dans tous SolderClient la variable soldat soldat est referencig juste une fourmi objet est le même pour tous les clients.

Comme modèle utilise un modèle Flyweight Singleton vous pouvez peut-être vérifier d'abord:

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

Chaque instance SoldierClient a une référence à un objet de soldat. Dans ce cas, ils pointent tous à la même instance. Vous remarquerez que pour chaque appel à SoldierFactory, le même objet soldat est retourné -. Il n'y a que le constructeur d'un appel soldat

Voir aussi Singleton

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top