Le fabbriche presentano molti vantaggi che consentono di progettare applicazioni eleganti in alcune situazioni. Uno è che puoi impostare le proprietà degli oggetti che in seguito desideri creare in un unico posto creando una fabbrica, e poi consegnare quella fabbrica. Ma spesso in realtà non è necessario farlo. In tal caso, l'utilizzo di una Factory aggiunge ulteriore complessità senza in realtà darti nulla in cambio. Prendiamo questa fabbrica, 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 l'eccessiva ingegnerizzazione è il tuo problema, sostituire una fabbrica con un costruttore non è probabilmente un grande miglioramento.
La sostituzione più semplice per entrambi i pattern è ovviamente quella di creare istanze di oggetti con un semplice costruttore con l' new
operatore:
Widget widget = new ColoredWidget(COLOR_RED);
I costruttori, tuttavia, presentano 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 desidera ricorrere alla creazione di una classe Builder o Factory completamente nuova, è possibile utilizzare invece un metodo factory. 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 alcuno stato interno può spesso essere sostituita con un tale metodo di fabbrica:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Una nuova funzionalità di Java 8 sono riferimenti ai metodi che consentono di passare i metodi in giro, proprio come si farebbe 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 puoi facilmente introdurre fabbriche in seguito, quando vedi un motivo per farlo.