Wenn wir Abstract Factory Pattern
verwenden, wir haben in der Regel FactoryMaker
Klasse, die eine getFactory
Funktion hat, in der wir Argument übergeben, und wir haben switch
oder if-else
Logik in der Funktion auf dem übergebenen Parameter, die Fabrik zu entscheiden, zurückgeben. Erzeugt übergebenen Parameter eine Enumeration oder ein Objekt, und dann wird die Logik, welche Factory in diesen Objekten zurückgegeben wird, besser sein. Zum Beispiel:Abstrakt Factory Design: wenn sonst mit Enum Ersetzen
Lassen Sie uns sagen, das wir unsere Fabrikhersteller, die enum CountryCode übergeben werden, um Fabrik zu entscheiden.
public class FacoryMaker { public final static FacoryMaker fctry= new FacoryMaker(); public static RetailFactory getFactory(CountryCode code){ RetailFactory rt = null; if(code == CountryCode.UK){ rt = new UKFactory(); } if(code == CountryCode.US){ rt = new USFactory(); } return rt; } }
dieser Stattdessen werden wir haben:
public class FacoryMaker { public final static FacoryMaker fctry= new FacoryMaker(); public static RetailFactory getFactory(CountryCode code){ return code.getFactory(); } }
und Enum wird wie folgt geändert werden:
public enum CountryCode { US(){ @Override public RetailFactory getFactory() { return new USFactory(); } }, UK(){ @Override public RetailFactory getFactory() { return new UKFactory(); } }; public abstract RetailFactory getFactory(); }
Aber ich sehe nicht, dies in der Regel folgt. Wieso ist es so? Warum können wir den übergebenen Parameter nicht immer zu einem Objekt machen und die Logik innerhalb des Objekts, von dem die Fabrik kommt, bekommen? Kann es unter irgendeinem abstrakten Fabrikdesign scheitern? Es sieht sehr allgemein aus. Dadurch ist es sogar möglich, den Fabrikhersteller zu entfernen und das Objekt direkt zu verwenden, um die Factory-Instanz zu erhalten.
Enum ist auch ein Objekt. So können wir Objekte für solche Fälle erstellen und Implementierungen in ihnen haben. Das wird von allen OOP-Sprachen unterstützt, oder? –
Es wird den Unterschied haben. Enum könnte hier sowohl als Konstante für die Parameterübergabe als auch als Objekt für Details der Factory-Implementierung verwendet werden.Wenn Sie eine Klasse verwenden, ist Ihr Übergabeparameter ebenfalls ein Objekt dieser Klasse. Das bedeutet, dass Sie Details der Fabrikimplementierung im Voraus kennen müssen und diese dann an die Methode übergeben müssen. Wenn Sie bereits über die Details der Factory-Implementierung Bescheid wussten, warum müssen Sie das abstrakte Fabrikmuster verwenden? –