Attribution des instances statiques pour les non-statiques modèle Flyweight
-
22-10-2019 - |
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
}
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:
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