Patrón de creación: método de fábrica
Este artículo explica cómo las clases derivadas pueden usar sus constructores para crear objetos apropiados.

¿Qué es?
Una fábrica de software crea objetos y una fábrica que produce bienes del mundo real produce bienes. Por ejemplo, la creación de objetos en Java suele ocurrir así:

El problema con ese enfoque es que, de repente, el código que usa el objeto SomeClass se vuelve dependiente de la implementación concreta de SomeClass . No hay nada de malo en crear nuevos objetos, pero este enfoque puede conducir a un acoplamiento estrecho de nuestro código con la clase de implementación concreta. Esto viola el código a una interfaz y no a una implementación.
El método de fábrica es un patrón de diseño de clase que proporciona una interfaz para crear objetos, pero permite que las subclases decidan qué clase instanciar.
Diagrama de clase
El diagrama de clases incluye los siguientes elementos:
- Producto
- Producto de hormigón
- Creador
- Creador de hormigón

Continuando con nuestro ejemplo de avión, supongamos que estamos tratando de modelar el avión de combate F-16. El código del cliente necesita construir un objeto de motor para este avión y volarlo. Una implementación ingenua para esta clase sería algo como lo siguiente:

En el código anterior, nos hemos comprometido a usar una implementación concreta de la clase F16. ¿Qué pasa si la compañía presenta versiones más nuevas de la aeronave y estamos obligados a representarlas en nuestro programa? Eso significaría cambiar el código del cliente donde creamos una instancia F16. Una salida es encapsular la creación de objetos en otro objeto que sea el único responsable de crear las variantes solicitadas del F-16. Para empezar, digamos que queremos representar las variantes A y B de F16; nuestro código podría verse así:

Una fábrica simple es un lenguaje de programación simple que no crea un objeto de fábrica. El método make se puede hacer estático para evitar crear un objeto innecesario. Sin embargo, dado que los métodos estáticos no se pueden anular en las subclases, no podremos usar esta fábrica simple como base para una jerarquía de clases abstracta.
Sin embargo, queremos mantener la creación de partes de objetos F16 dentro de la misma clase y aún poder introducir nuevas variantes de F16 a medida que surjan. En ese caso, podríamos subclase F16 y delegar la creación del objeto variante F16 correcto a la subclase que maneja esa variante. ¡Así es precisamente como funciona el patrón del método de fábrica! El método de fábrica aquí es makeF16() que creará una nueva variante F16 cuando se llame. Procediendo hacia adelante, presentamos dos subclases así

Subclasificamos y especializamos el objeto del motor usando la herencia. Un método de fábrica puede proporcionar o no una implementación genérica o predeterminada; sin embargo, aún podemos anularlo en subclases para especializar o modificar el producto. Nuestro ejemplo tiene dos modelos variantes, cada uno con un motor diferente pero la misma cabina. El código del cliente ahora puede usar los modelos más nuevos así:

Tenga en cuenta que el patrón de diseño del método de fábrica devuelve un tipo abstracto, ya sea una interfaz de Java o una clase abstracta de Java. La superclase, en nuestro caso F16, no sabe qué tipo específico de F16 devolvió el método makeF16(). En general, un método de creación es abstracto o viene con una implementación predeterminada invocada por los otros métodos de la superclase. Así que depende de las subclases crear tipos específicos de objetos.
Diferencias con Simple/Static Factory
El patrón de método de fábrica es similar a la fábrica simple o estática, pero las diferencias incluyen que las fábricas simples no pueden producir productos variables a través de la herencia como lo hace un patrón de método de fábrica.
Otros ejemplos
El patrón del método de fábrica es omnipresente en los conjuntos de herramientas y los marcos. El patrón se puede usar siempre que una clase no sepa de antemano qué objetos de subclase necesitaría instanciar. Esto sucede a menudo en el diseño del marco, donde se espera que los consumidores del marco amplíen las clases abstractas proporcionadas por el marco y la funcionalidad de enlace o las creaciones de objetos.
La API de Java expone varios métodos de fábrica:
java.util.Calendar.getInstance()
java.util.ResourceBundle.getBundle()
java.text.NumberFormat.getInstance()
Advertencias
- El patrón puede resultar en tener demasiadas subclases con solo pequeñas diferencias entre ellas.
- Si una subclase agrega funcionalidad a una superclase, no puede usar los nuevos métodos a menos que reduzca el objeto a su tipo concreto. Desafortunadamente, Downcasting puede fallar en tiempo de ejecución.