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   
    }
¿Fue útil?

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 moveSoldierPará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:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top