Frage

Ich ging durch den Flygewichts -Beispielcode bei http://www.oodessign.com/flyweight-pattern-wargame-example-java-sourcecode.html Und fragen Sie sich, wie es wirklich funktioniert, wenn wir eine statische Instanz zuweisen (SOLDIER wie vor dem obigen Standort) zu einer nicht statischen Soldateninstanz in SoldierClient Reduzieren wir die Objektgröße seit jedem wirklich? SoldierClient wird irgendwie eine Kopie von halten SOLDIER Instanz in jedem SoldierClient Objekt, das wir erstellen?

BEARBEITEN:

In der Methode moveSoldier() es sagt

// Soldier -Darstellung vom vorherigen Standort löschen
// dann die Soldatenvertretung an einem neuen Ort aufnehmen

Wie kommt es, dass dies nicht alle im Unterricht erstellten Objekte betrifft 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   
    }
War es hilfreich?

Lösung

EIN SoldierClient Hält nicht a Kopieren von SOLDIER, es enthält a Hinweis zu SOLDIER, und jeder SoldierClient Hält einen Hinweis auf die gleich SOLDIER.

Beantwortung der Bearbeitung

Die Lage eines Soldaten wird in der Lage sein SoldierClient Instanzen (currentLocationX und currentLocationY Eigenschaften). Der Code -Kommentar für diese Eigenschaften buchstabiert es ebenfalls aus: "Dieser Zustand wird vom Kunden gepflegt" (dh "dieser Zustand wird in der nicht aufrechterhalten SoldierImp Beispiel").

Alles ist in moveSoldierParameter: Es gibt keine SoldierImp Instanzzustand. Stellen Sie sich es wie eine statische Versorgungsmethode vor. Koordinaten werden von der bereitgestellt SoldierClient Beispiel; Sie werden nie von der gespeichert SoldierImp-Nur benutzt.

Andere Tipps

Wie die Dokumentation erwähnt:

Die Lösung besteht darin, den gemeinsamen Zustand der Soldaten in einem gemeinsamen Objekt zu halten

Wirklich, jeder Lötmittel hat einen Hinweis auf Soldat, keine Kopie. In jedem Lötmittel die Variable Soldat Soldat ist Referencig nur auf ein Objekt Ant, es ist für alle Clients gleich.

Da das Fliegengewicht ein Singleton -Muster verwendet, können Sie es vielleicht zuerst überprüfen:

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

Jeder Soldatclient -Instanz hat eine Hinweis zu einem Soldatenobjekt. In diesem Fall weisen sie alle auf die gleiche Instanz hin. Sie werden feststellen, dass für jeden Anruf bei SoldierFactory dasselbe Soldatenobjekt zurückgegeben wird - es gibt nur einen Call -Soldatenkonstruktor.

Siehe auch Singleton

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top