Patrones de Diseño: Introducción al Patrón Factory

Clase 7 de 27Curso de Patrones de Diseño en JavaScript

Resumen

¿Qué son los patrones de diseño creacionales y por qué son importantes?

Los patrones de diseño son soluciones probadas a problemas recurrentes en el desarrollo de software. Dentro de ellos, los patrones creacionales se enfocan en la manera de crear objetos. Son especialmente valiosos ya que simplifican y optimizan el proceso de instanciación, haciendo el código más flexible y fácil de mantener. Uno de los patrones creacionales más destacados es el patrón de fábrica (Factory Pattern), que centra su atención en la creación de objetos a partir de una superclase, permitiendo modularidad y extensibilidad.

¿Cómo funcionan los patrones de fábrica?

El patrón de fábrica es un diseño muy útil que ofrece una interfaz para la creación de objetos basados en una superclase. Esto facilita que las subclases creadoras alteren el tipo de objetos a retornar, lo que enriquece su versatilidad. En esencia, el patrón sugiere el uso de un método fábrica en lugar de instanciar objetos directamente con el operador new, lo que ayuda a desacoplar el código y a adaptarlo para incluir nuevos objetos sin necesidad de modificar muchas líneas de código existente.

¿Cómo podemos aplicar el patrón de fábrica en una aplicación de coches?

Imagina que creamos una aplicación para manejar la producción de coches que inicialmente solo fabrica un modelo: el "Mastodon". A medida que la aplicación evoluciona, surge la necesidad de añadir un nuevo modelo llamado "Rhino". Sin el patrón de fábrica, esta ampliación requeriría una refactorización extensa del código. Sin embargo, implementando el patrón, podemos:

  1. Implementar un método fábrica que maneje la creación de ambos modelos de coches.
  2. Crear una clase MastodonFactory que regrese el coche Mastodon.
  3. Crear una clase RhinoFactory que regrese el coche Rhino.

Ambas fábricas seguirán la misma interfaz o clase base, asegurando que cualquier coche producido comparta una interfaz común.

Ejemplo de código en pseudocódigo:

interface CocheBase {
    void mostrarCosto();
}

class Mastodon implements CocheBase {
    void mostrarCosto() {
        // implementación específica de Mastodon
    }
}

class Rhino implements CocheBase {
    void mostrarCosto() {
        // implementación específica de Rhino
    }
}

interface FabricaDeCoches {
    CocheBase crearCoche();
}

class MastodonFactory implements FabricaDeCoches {
    CocheBase crearCoche() {
        return new Mastodon();
    }
}

class RhinoFactory implements FabricaDeCoches {
    CocheBase crearCoche() {
        return new Rhino();
    }
}

¿Cuál es la ventaja de usar una interfaz de producto común?

Al utilizar una interfaz común para los productos, todas las instancias creadas a través de las fábricas compartirán un comportamiento similar. Esto simplifica la sustitución e integración de nuevos modelos. Si cada coche implementa esta interfaz, podemos llamarlos intercambiablemente en cualquier parte de nuestra aplicación sin preocuparnos del tipo específico. Esta flexibilidad es similar a construir un "gateway" que pueda manejar diferentes protocolos, como REST o GraphQL, dentro del mismo marco estructural.

En resumen, los patrones de fábrica no solo simplifican la adición de nuevos productos, sino que también proporcionan un marco sólido y flexible para el futuro crecimiento de nuestras aplicaciones. Al adoptar estas prácticas, podemos crear código más limpio, modular y fácil de mantener. ¡Sigue aprendiendo y aplicando patrones de diseño para llevar tus habilidades de programación al siguiente nivel!