Las fábricas tienen muchas ventajas que permiten diseños de aplicaciones elegantes en algunas situaciones. Una es que puede establecer las propiedades de los objetos que luego desea crear en un lugar creando una fábrica, y luego entregar esa fábrica. Pero a menudo no necesitas hacer eso. En ese caso, usar una Fábrica simplemente agrega complejidad adicional sin realmente darle nada a cambio. Tomemos esta fábrica, por ejemplo:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Una alternativa al patrón Factory es el patrón Builder muy similar. La principal diferencia es que las propiedades de los objetos creados por una Fábrica se establecen cuando se inicializa la Fábrica, mientras que un Generador se inicializa con un estado predeterminado y todas las propiedades se establecen después.
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
Pero cuando la sobre ingeniería es su problema, reemplazar una Fábrica con un Constructor probablemente no sea una gran mejora.
El reemplazo más simple para cualquiera de los patrones es, por supuesto, crear instancias de objetos con un constructor simple con el new
operador:
Widget widget = new ColoredWidget(COLOR_RED);
Sin embargo, los constructores tienen un inconveniente crucial en la mayoría de los lenguajes orientados a objetos: deben devolver un objeto de esa clase exacta y no pueden devolver un subtipo.
Cuando necesite elegir el subtipo en tiempo de ejecución pero no desee recurrir a la creación de una clase Builder o Factory completamente nueva para eso, puede utilizar un método factory en su lugar. Este es un método estático de una clase que devuelve una nueva instancia de esa clase o una de sus subclases. Una Fábrica que no mantiene ningún estado interno a menudo se puede reemplazar con un método de fábrica de este tipo:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Una nueva característica en Java 8 son las referencias de métodos que le permiten pasar métodos, tal como lo haría con una fábrica sin estado. Convenientemente, cualquier cosa que acepte una referencia de método también acepta cualquier objeto que implemente la misma interfaz funcional, que también puede ser una Fábrica completa con estado interno, por lo que puede introducir fácilmente fábricas más tarde, cuando vea una razón para hacerlo.