terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat factory-method.md
guest@codeandosimple: ~/blog/design-patterns $ cat factory-method.md

Factory Method_

// "La mejor manera de empezar es dejar de hablar y comenzar a hacer" - Walt Disney

# 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

Estructura Factory Method

# 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.

Ejemplo Factory Method Documentos

# 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.

Temas relacionados

PATTERNS_02

Abstract Factory

PATTERNS_05

Prototype