Asignación de instancias estáticas a las no estáticas en el patrón de peso mosca
-
22-10-2019 - |
Pregunta
Estaba pasando por el código de muestra de peso mosca en http://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html y preguntándome cómo funciona realmente cuando asignamos una instancia estática (SOLDIER
como en el sitio anterior) a una instancia de soldado no estática en SoldierClient
¿Realmente reducimos el tamaño del objeto desde cada uno SoldierClient
de alguna manera tendrá una copia de SOLDIER
instancia en cada SoldierClient
objeto que creamos?
EDITAR:
En el método moveSoldier()
dice
// Eliminar la representación de soldados de la ubicación anterior
// luego representa la representación del soldado en una nueva ubicación
¿Cómo es que esto no afecta a todos los objetos creados en clase? 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
}
Solución
A SoldierClient
no tiene un Copiar de SOLDIER
, tiene un referencia a SOLDIER
, y cada SoldierClient
tiene una referencia al mismo SOLDIER
.
Respondiendo a la edición
La ubicación de cada soldado se mantiene en SoldierClient
instancias (currentLocationX
y currentLocationY
propiedades). Los comentarios del código para esas propiedades también lo explican: "Este estado es mantenido por el cliente" (es decir, "este estado no se mantiene en el SoldierImp
instancia").
Todo esta en moveSoldier
Parámetros: no hay SoldierImp
estado de instancia. Piense en ello como un método de utilidad estática. Las coordenadas son proporcionadas por el SoldierClient
instancia; nunca son almacenados por el SoldierImp
-JUST USE.
Otros consejos
Como menciona la documentación:
La solución es mantener el estado común de los soldados en un objeto compartido
Realmente cada solderclient tiene una referencia a Soldier, no una copia. En cada solderclient la variable Soldado soldado se hace referencia solo a una hormiga de objeto Es lo mismo para todos los clientes.
Dado que Flyweight Pattern usa un patrón Singleton, tal vez pueda verificarlo primero:
Cada instancia de Soldierclient tiene un referencia a un objeto de soldado. En este caso, todos apuntan a la misma instancia. Notará que para cada llamada a SoldierFactory, se devuelve el mismo objeto de soldado: solo hay una llamada al constructor de soldado.
Ver también único