Abstract Factory skaliert ganz gut.
Es gibt ein Grundprinzip, das besagt, dass eine Klasse eine Sache gut machen sollte. Ihr Problem hier ist, dass Sie versuchen, viele Klassen dazu zu bringen, viele Dinge zu tun.
Sie müssen sich nicht an eine abstrakte Fabrik halten. Sie können (und sollten) mehrere haben:
AbstractProductAFactory
definiert die Schnittstelle zur Herstellung von ProductA. Ihre konkreten Implementierungen (ConcreteProductAFactory1, ConcreteProductAFactory2) würden es erweitern.
AbstractProductBFactory
definiert die Schnittstelle zur Herstellung von ProductB. Ihre konkreten Implementierungen ( ConcreteProductBFactory1
, ConcreteProductBFactory2
) würden es erweitern.
Wenn Sie dann ein ProductC benötigen, erstellen Sie ein neues AbstractProductCFactory
. Sie müssen keine Ihrer anderen Fabriken auf diese Weise ändern.
UPDATE
Idealerweise sollte ProductA eine Produktklasse darstellen, dh alle Produkte, die eine Schnittstelle gemeinsam nutzen, die Sie ProductA nennen. In den Kommentaren schlage ich vor, dass dies so etwas wie eine Pizza ist:
interface AbstractPizzaFactory {
public Pizza buildPizza(List<Topping> toppings);
}
class ThinCrustPizzaFactory implements AbstractPizzaFactory {
public Pizza buildPizza(List<Topping> toppings){
...
}
}
class DeepDishPizzaFactory implements AbstractPizzaFactory {
public Pizza buildPizza(List<Topping> toppings){
...
}
}
Und so weiter. Das Hinzufügen einer PanPizzaFactory wirkt sich nicht auf eine der anderen Klassen aus - es handelt sich lediglich um eine neue konkrete Implementierung der PizzaFactory. Wenn Sie Produkte haben, die keine Pizza sind - zum Beispiel Sandwiches -, erstellen Sie dort eine weitere abstrakte Fabrik (z AbstractSandwichFactory
. B. ).
Der eigentliche Punkt ist, dass Sie keine abstrakte Fabrik haben möchten, die zwei sehr unterschiedliche Produkttypen mit zwei unterschiedlichen "Build" -Methoden erstellt. Gruppieren Sie sie so logisch wie möglich, damit sie eine Schnittstelle gemeinsam nutzen, und erstellen Sie dann eine abstrakte Factory, die definiert, wie konkrete Fabriken Implementierungen dieser Schnittstelle erstellen sollen.