Frage

Ich habe eine abstrakte Fabrik wie diese

implementiert
public abstract class AbstractFactory {

    private static final Map FACTORIES = new HashMap();    

    AbstractFactory(FactoryType type) {
        FACTORIES.put(type, this);
    }   

    public abstract A getA();

    public abstract B getB();

    public static AbstractCatalogFactory getFactory(FactoryType type) {
        return (AbstractCatalogFactory) FACTORIES.get(type);
    }
}

Ein Betonwerk muss diese abstrakte Fabriken Konstruktor aufrufen, so dass jede konkrete Umsetzung in der FACTORIES Karte registriert sein. Ich bin ein wenig besorgt über in einem Konstruktor this Bezug genommen wird, weil es wie der Wert von this scheint sollte zurückgekehrt, bis die Ausführung des Konstruktors nicht definiert werden.

Danke, Don

War es hilfreich?

Lösung

über this aus dem undichten Konstruktor

Ich bin ein wenig besorgt über in einem Konstruktor this Bezug genommen wird, weil es wie der Wert von this scheint sollte, bis die Ausführung des Konstrukteurs undefiniert ist zurückgekehrt.

Genauer gesagt soll die this Referenz nicht durchsickern des Konstrukteurs zu externen Parteien vor dem Konstruktor beendet. Andernfalls wird die externe Partei könnte eine Methode auf das noch unvollendeten neue Objekt am Ende aufgerufen wird.

Ihre Implementierung hat eine Chance, dass dies geschieht, da this zur Karte hinzugefügt wird, die von Dritten über die statische Methode getInstance zugänglich ist. Abhilfe könnte Zugriff auf die Karte wird synchronisiert. Eine weitere Option (wie von Josh Bloch in Effective Java diskutiert) wäre die Konstrukteurs privaten in einer konkreten Unterklasse zu machen, und hat eine statische Factory-Methode statt in jeder Unterklasse, um das Objekt zu konstruieren, dann füge auf der Karte. Dies würde allerdings in einiger Code-Duplizierung zur Folge hat.

Über Ihr Design

Anscheinend setzen Sie einen „Katalog von Fabriken“ und nicht als „Fabrik der Produkte“, so dass diese ziemlich verschieden von dem klassischen sind Abstract Factory . Ohne weitere Informationen ist es schwer zu sagen, ob dies gerechtfertigt ist.

Das Hauptproblem ist hier, dass Sie die Fabrik-Schnittstelle und die Fabrik „Speicher“ vereinigen, die IMO ist keine gute Idee. Kunden der Fabrik nur sollten die Fabrik Schnittstelle mit seinen getX Methoden sehen, und nicht wissen, was konkret Fabrik sollte sie tatsächlich verwendet (viel weniger Auswählen es selbst).

Darüber hinaus, in der Regel gibt es nur eine konkrete Produktfamilie im Einsatz zu einem bestimmten Zeitpunkt, so dass nur eine konkrete Art der Fabrik benötigt wird. Dies schließt die Möglichkeit nicht kompatibler Produkte aus verschiedenen konkreten Produktfamilien vermischen. Ihr aktuelles Design scheint dies zu ermöglichen, die kein gutes Zeichen für mich ist - aber vielleicht haben Sie einen guten Grund für diesen ...

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