Fabriken haben viele Vorteile, die in manchen Situationen ein elegantes Anwendungsdesign ermöglichen. Zum einen können Sie die Eigenschaften von Objekten, die Sie später erstellen möchten, an einem Ort festlegen, indem Sie eine Factory erstellen und diese Factory dann übergeben. Aber oft muss man das gar nicht machen. In diesem Fall erhöht die Verwendung einer Factory lediglich die Komplexität, ohne dass Sie tatsächlich eine Gegenleistung erhalten. Nehmen wir zum Beispiel diese Fabrik:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Eine Alternative zum Factory-Muster ist das sehr ähnliche Builder-Muster. Der Hauptunterschied besteht darin, dass die Eigenschaften der von einer Factory erstellten Objekte beim Initialisieren der Factory festgelegt werden, während ein Builder mit einem Standardstatus initialisiert wird und anschließend alle Eigenschaften festgelegt werden.
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
Wenn Sie jedoch ein Problem mit der Überentwicklung haben, ist das Ersetzen einer Factory durch einen Builder wahrscheinlich keine große Verbesserung.
Der einfachste Ersatz für eines der Muster ist natürlich das Erstellen von Objektinstanzen mit einem einfachen Konstruktor mit dem new
Operator:
Widget widget = new ColoredWidget(COLOR_RED);
Konstruktoren haben jedoch in den meisten objektorientierten Sprachen einen entscheidenden Nachteil: Sie müssen ein Objekt dieser genauen Klasse zurückgeben und können keinen Untertyp zurückgeben.
Wenn Sie den Subtyp zur Laufzeit auswählen müssen, aber dafür keine neue Builder- oder Factory-Klasse erstellen möchten, können Sie stattdessen eine Factory-Methode verwenden. Dies ist eine statische Methode einer Klasse, die neue Instanzen dieser Klasse oder einer ihrer Unterklassen zurückgibt. Eine Factory, die keinen internen Zustand beibehält, kann häufig durch eine solche Factory-Methode ersetzt werden:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Eine neue Funktion in Java 8 sind Methodenreferenzen, mit denen Sie Methoden weitergeben können, genau wie Sie es mit einer zustandslosen Factory tun würden. Praktischerweise akzeptiert jede Methode, die eine Methodenreferenz akzeptiert, auch alle Objekte, die dieselbe Funktionsschnittstelle implementieren. Dies kann auch eine vollwertige Factory mit internem Status sein, sodass Sie Fabriken später problemlos einführen können, wenn Sie einen Grund dafür sehen.