# Propósito
El Factory Method define una interfaz para crear un objeto, pero deja que las subclases decidan qué clase instanciar. Delega en las subclases la creación del objeto.
# Problema
La necesidad de crear objetos sin especificar la clase del objeto que se va a crear. En un ejemplo del ámbito de la cocina: debemos preparar un plato, pero no sabemos si será una sopa, una ensalada o un postre hasta el último momento.
# Solución
La solución que ofrece el Factory Method es:
-
Definir una interfaz de creación de objetos: Crear una interfaz o método abstracto para la creación de objetos.
-
Delegar la creación a las subclases: Las subclases tendrán la implementación concreta para la creación de objetos.
Como resultado, el cliente puede trabajar con interfaces o clases abstractas sin tener que conocer las clases concretas. Es como tener un método general para “preparar un platoâ€, pero las subrecetas son las que determinan los ingredientes y procedimientos específicos.
# Estructura
# Participantes
-
Creador: Define el método abstracto para la creación del objeto.
-
CreadorConcreto: Implementa el método factoryMethod. Devuelve una instancia del ProductoConcreto.
-
Producto: Interfaz o clase abstracta de los objetos que se crearán.
-
ProductoConcreto: Implementación específica del producto que se crea.
# Cuándo Usarlo
-
Una clase no puede prever la clase de objetos que debe crear.
-
Una clase quiere que sean las subclases quienes decidan los objetos que crea.
# Ventajas
-
verified
Flexibilidad
Al delegar la creación de objetos a las subclases.
-
verified
Desacoplamiento
Separa el código de construcción del código propio del producto.
# Desventajas
-
warning
Complejidad
Requiere la creación de múltiples subclases, mayor tiempo de desarrollo.
# Ejemplo: Gestión de Documentos
Pensemos en un sistema de gestión de documentos donde los usuarios pueden crear diferentes tipos (texto, planillas, presentaciones). Cada tipo tiene características propias pero comparten funcionalidades básicas como abrir, cerrar y guardar.
Problema
Los usuarios deben poder crear un documento, pero el tipo exacto dependerá de la elección del usuario en tiempo de ejecución.
Solución planteada
Implementamos un Factory Method que permite a las subclases decidir qué clase de documento instanciar. DocumentManager actuaría como el cliente.
# Código Java
abstract class Document {
public abstract void open();
public abstract void close();
public abstract void save();
}
class TextDocument extends Document {
@Override
public void open() { /* ... */ }
@Override
public void close() { /* ... */ }
@Override
public void save() { /* ... */ }
}
abstract class DocumentCreator {
public abstract Document createDocument();
}
public class TextDocumentCreator extends DocumentCreator {
@Override
public Document createDocument() {
return new TextDocument();
}
}
public class DocumentManager {
public static void main(String[] args) {
DocumentCreator creator = new TextDocumentCreator();
Document doc = creator.createDocument();
doc.open();
doc.save();
doc.close();
}
}
# Mapeo Participantes
- DocumentCreator (Creador): Define el método fábrica.
- TextDocumentCreator (CreadorConcreto): Implementa el método para devolver un tipo específico.
- Document (Producto): Define la interfaz común.
- TextDocument (ProductoConcreto): Implementación específica.
- DocumentManager (Cliente): Decide qué documento crear.
# Conclusiones
Este enfoque mantiene el código flexible y extensible, permitiendo agregar fácilmente nuevos tipos de documentos sin modificar el código existente.
# Patrones relacionados
Abstract Factory
Factory Method crea un solo objeto; Abstract Factory crea una familia.
Builder
Builder construye paso a paso; Factory Method en un solo paso.
Prototype
Prototype usa clonación en lugar de herencia del Creador.
Template Method
Los métodos de fabricación suelen invocarse desde un Template Method.