Patrones de diseño: una guía rápida de Abstract Factory.

Esta es una guía rápida para dominar uno de los patrones de diseño más utilizados, Abstract Factory. Aunque los ejemplos de codificación estarán en C ++, ya que me siento más cómodo, se pueden ajustar fácilmente a cualquier lenguaje de programación como Java, Python, C #, Javascript y más.

Abstract Factory se clasifica en los patrones de diseño de creación que se trata de instanciación de clase / objeto. Más precisamente, cómo usar efectivamente la herencia (patrones de creación de clase) o la delegación (patrones de creación de objetos). [por Patrones de diseño explicados simplemente]

Definición de fábrica: "Es un edificio o grupo de edificios donde se fabrican / crean productos". Los productos se envían a los clientes para su uso bajo su propia responsabilidad. Al mismo tiempo, los clientes de la fábrica son muchos, debería ser bastante fácil para los clientes pedir su producto y, de manera similar, que la fábrica se adapte según las necesidades del cliente.

Conectemos los puntos para comprender este patrón de diseño. Lo usamos cuando necesitamos una interfaz para la creación de objetos dependientes sin especificar necesariamente sus clases concretas. Al mismo tiempo, queremos encapsular la construcción de "productos" utilizando la herencia.

Paso 1 - Palabras clave

Definir palabras clave es la receta secreta en esta serie de guías rápidas. Este método me ayudó a comprender realmente los patrones de diseño, codificarlos en mi mente y comprender las diferencias entre otros patrones de diseño.

  1. Producto: Es un objeto construido por una fábrica y está incluido en una familia de objetos. Es muy específico ya que no hay abstracción. Ejemplo: BMWdoorHandle, FordDoorHandle.
  2. Producto abstracto: es una vista de nivel superior de un producto que define su familia. Ejemplo DoorHandle, DoorWindow
  3. Fábrica de concreto: es una fábrica que está micro-gestionando "físicamente" la creación y finalización de un producto. Ejemplo: BMWFactory, FordFactory.
  4. Abstract Factory: es una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas. Ejemplo: CarFactory

Paso 2: diagrama

Cuando se discute Abstract Factory, todo debería ser relevante para las palabras clave anteriores. Si el código comienza a diferir de esas palabras, entonces probablemente algo no está del todo bien. Hagamos esto simple, Concrete Factory está heredando de Abstract Factory y Product from Abstract Product. El diagrama es tan simple como parece; dos clases que heredan de sus clases abstractas. La fábrica de concreto es la que hace el trabajo sucio para crear productos específicos (que se identifica por la línea roja). Ahora con este diagrama, es fácil entender que este patrón de diseño se puede actualizar fácilmente agregando más fábricas concretas y más productos, es decir, ProductC, ProductD, etc.

Paso 3 - Código por ejemplo

Sugeriría copiar el código clase por clase desde mi repositorio git "Andreas Poyias" y pegarlo en cualquier editor de C ++ en línea como c ++ shell, jdoodle o onlineGDB o cualquier otro y ejecutarlo para observar el resultado. Luego lea los comentarios o la descripción a continuación. Los nombres de las clases están escritos de tal manera que después del guión bajo, le doy la palabra clave relacionada.

ResumenProducto
El producto abstracto es una clase abstracta y, como se esperaba, define una familia de productos que hereda de él. En este ejemplo, el producto abstracto es aDoorHandle, agregué una función que imprime algo con el propósito de mostrar.

#include 
clase DoorHandle_AbstractProduct
{
público:
 // Una función ficticia que imprime algo
 virtual void printSerialNumber () = 0;
};

Producto
En este ejemplo, los productos son manijas de puerta BMW o Ford. Tienen diferentes números de serie, por lo tanto, cada clase puede imprimir su propio número de serie específico del producto. También podríamos tener DoorWindoworSteeringWheel. Las clases de tiradores de puerta heredan de la clase abstracta anterior.

// Tirador de puerta BMW [en la familia de tiradores de puerta]
clase BMWDoorHandle_Product: public DoorHandle_AbstractProduct
{
público:
    // Imprime el número de serie específico del producto
    vacío printSerialNumber () {
        std :: cout << "DoorHandle_Product: BMW123 \ n";
    }
};
// Tirador de puerta Ford [en la familia de tiradores de puerta]
clase FordDoorHandle_Product: public DoorHandle_AbstractProduct
{
público:
    // Imprime el número de serie específico del producto
    vacío printSerialNumber () {
        std :: cout << "DoorHandle_Product: Ford123 \ n";
    }
};

AbstracFactory
 Esta es una clase muy genérica / abstracta que no debería tener mucho más que las funciones create. Al final, una fábrica solo está creando productos.

clase Car_AbstractFactory
{
público:
 virtual DoorHandle_AbstractProduct * createDoorHandle () = 0;
 // virtual DoorWindow_AbstractProduct * createDoorWindow () = 0;
};

ConcreteFactory
Esta clase de fábrica es bastante específica para el producto. Es el trabajador el que arma el rompecabezas. En este ejemplo, es específico de una marca {BMW, Ford}. Su trabajo es devolver una instancia de un producto que sea específico de esa marca. Una vez más, si quisiéramos crearBMWDoorWindow, podríamos crear una nueva función que devuelva una instancia de la clase abstracta relevante. En mi repositorio git, también está la implementación completa con las partes DoorWindow.

clase BMWCar_ConcreteFactory: public Car_AbstractFactory
{
público:
    DoorHandle_AbstractProduct * createDoorHandle () {
        devolver nuevo BMWDoorHandle_Product;
    }
};
clase FordCar_ConcreteFactory: public Car_AbstractFactory
{
público:
    DoorHandle_AbstractProduct * createDoorHandle () {
        devolver nuevo FordDoorHandle_Product;
    }
};

Función principal
Finalmente, este es el último fragmento de código. La función principal que opera como cliente. El cliente puede "ordenar" fácilmente los productos de la fábrica y puede usarlos de la forma que desee.

int main ()
{
    // El cliente necesita un doorHandle y un doorWindow
    Car_AbstractFactory * abstractFactory;
    DoorHandle_AbstractProduct * dHandle_AbstractProduct;
 
    // El cliente necesita productos de la marca Ford
    abstractFactory = new FordCar_ConcreteFactory;
    // la fábrica de hormigón Ford los crea
    // y los devuelve al cliente
    dHandle_AbstractProduct = abstractFactory-> createDoorHandle ();
    // El cliente usa los productos
    dHandle_AbstractProduct -> printSerialNumber ();
    // Ahora el cliente quiere productos pero de la marca BMW
    abstractFactory = new BMWCar_ConcreteFactory;
    // Entonces la fábrica de hormigón BMW los crea
    // y los devuelve al cliente
    dHandle_AbstractProduct = abstractFactory-> createDoorHandle ();
    // El cliente usa los productos
    dHandle_AbstractProduct -> printSerialNumber ();
devuelve 0;
}
// Salida
// DoorHandle_Product: Ford123
// DoorHandle_Product: BMW123

Los beneficios pueden no ser obvios al instante. Pero imagine por un segundo cuántos productos tiene un automóvil y cuántas cosas puede hacer una fábrica de automóviles. Ahora imagine que el caos mantiene un código mal diseñado cada vez que BMW decide alterar la manija de una puerta. Agregue un nuevo tipo de asiento del conductor o incluso cambie algo en el motor. Ahora agregando complejidad, imagine mantener estos problemas pero para múltiples marcas. Abstract factory ofrece un enfoque limpio y fácil de mantener, que puede usarse en los años venideros. Sería difícil para un nuevo desarrollador equivocarse y es muy fácil agregar / eliminar un nuevo producto.

La fábrica abstracta es solo el comienzo de este viaje. Este es uno de los patrones de diseño más utilizados y muchas veces se usa en combinación con otros patrones de diseño. El próximo blog será una guía rápida del patrón de diseño Singleton. No olvides darle me gusta a mi blog y seguir mi cuenta. Esto es para darme la satisfacción de haber ayudado a otros desarrolladores y empujarme a seguir escribiendo.

Otras guías rápidas sobre patrones de diseño:

  1. Patrones de diseño: una guía rápida de Abstract Factory.
  2. Patrones de diseño: una guía rápida para el patrón de puente.
  3. Patrones de diseño: una guía rápida para el patrón de construcción.
  4. Patrones de diseño: una guía rápida para el patrón de decorador.
  5. Patrones de diseño: una guía rápida para el patrón de fachada.
  6. Patrones de diseño: una guía rápida para el patrón de observador.
  7. Patrones de diseño: una guía rápida del patrón Singleton.