Le fabbriche hanno molti vantaggi che consentono l'elegante design delle applicazioni in alcune situazioni. Uno è che è possibile impostare le proprietà degli oggetti che in seguito si desidera creare in un unico posto creando una fabbrica, quindi consegnare quella fabbrica. Ma spesso non hai davvero bisogno di farlo. In tal caso, l'utilizzo di una Factory aggiunge ulteriore complessità senza in realtà dare nulla in cambio. Prendiamo questo stabilimento, ad esempio:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Un'alternativa al modello Factory è il modello Builder molto simile. La differenza principale è che le proprietà degli oggetti creati da una Factory vengono impostate quando la Factory viene inizializzata, mentre un Builder viene inizializzato con uno stato predefinito e tutte le proprietà vengono impostate in seguito.
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
Ma quando il tuo problema è l'overengineering, la sostituzione di una Factory con un Builder non è probabilmente un miglioramento.
La sostituzione più semplice per entrambi i pattern è ovviamente la creazione di istanze di oggetti con un semplice costruttore con l'operatore new
:
Widget widget = new ColoredWidget(COLOR_RED);
I costruttori, tuttavia, hanno uno svantaggio cruciale nella maggior parte dei linguaggi orientati agli oggetti: devono restituire un oggetto di quella classe esatta e non possono restituire un sottotipo.
Quando è necessario scegliere il sottotipo in fase di esecuzione ma non si vuole ricorrere alla creazione di un Builder o di una classe Factory completamente nuovi, è possibile utilizzare invece un metodo di produzione. Questo è un metodo statico di una classe che restituisce una nuova istanza di quella classe o una delle sue sottoclassi. Una fabbrica che non mantiene nessuno stato interno può essere spesso sostituita con un metodo di produzione simile:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Una nuova funzionalità in Java 8 sono riferimenti al metodo che consentono di passare metodi in giro, proprio come faresti con una fabbrica senza stato. Convenientemente, tutto ciò che accetta un riferimento al metodo accetta anche qualsiasi oggetto che implementa la stessa interfaccia funzionale, che può anche essere una fabbrica a pieno titolo con stato interno, quindi è possibile introdurre facilmente le fabbriche in un secondo momento, quando si vede una ragione per farlo. / p>