Abstract Factory

Patrón creacional

Problema

Si una aplicación debe ser portátil, debe encapsular las dependencias de la plataforma. Estas "plataformas" pueden incluir: sistema de ventanas, sistema operativo, base de datos, etc. Muy a menudo, esta encapsulación no está diseñada de antemano, y muchas declaraciones de casos con opciones para todas las plataformas compatibles actualmente comienzan a procrear como conejos en todo el código.

Explicación

Proporcionar un nivel de direccionamiento indirecto que resuma la creación de familias de objetos relacionados o dependientes sin especificar directamente sus clases concretas. El objeto "de fábrica" tiene la responsabilidad de proporcionar servicios de creación para toda la familia de plataformas. Los clientes nunca crean objetos de plataforma directamente, le piden a la fábrica que haga eso por ellos.

Estructura

El patrón Abstract Factory define un método de fábrica por producto. Cada Método de Fábrica encapsula al nuevo operador y las clases de productos concretos, específicos de la plataforma. Cada "plataforma" se modela con una clase derivada de Factory.

Ejemplo

El propósito de Abstract Factory es proporcionar una interfaz para crear familias de objetos relacionados, sin especificar clases concretas. Este patrón se encuentra en el equipo de estampado de chapa metálica utilizado en la fabricación de automóviles japoneses. El equipo de estampado es una fábrica abstracta que crea partes de carrocería. La misma maquinaria se utiliza para sellar puertas de la derecha, puertas de la izquierda, guardabarros delanteros derechos, guardabarros delanteros izquierdos, capuchas, etc. para diferentes modelos de automóviles. Mediante el uso de rodillos para cambiar las matrices de estampado, las clases de concreto producidas por la maquinaria se pueden cambiar en tres minutos.

// class CPU
abstract class CPU {}

// class EmberCPU
class EmberCPU extends CPU {}

// class EnginolaCPU
class EnginolaCPU extends CPU {}

// class MMU
abstract class MMU {}

// class EmberMMU
class EmberMMU extends MMU {}

// class EnginolaMMU
class EnginolaMMU extends MMU {}

Clases

// class EmberFactory
class EmberToolkit extends AbstractFactory {
    @Override
    public CPU createCPU() {
        return new EmberCPU();
    }

    @Override
    public MMU createMMU() {
        return new EmberMMU();
    }
}

Factoría 1

// class EnginolaFactory
class EnginolaToolkit extends AbstractFactory {
    @Override
    public CPU createCPU() {
        return new EnginolaCPU();
    }

    @Override
    public MMU createMMU() {
        return new EnginolaMMU();
    }
}

Factoría 2

enum Architecture {
    ENGINOLA, EMBER
}

Enum

Abstract Factory

public class Client {
    public static void main(String[] args) {
        AbstractFactory factory = AbstractFactory.getFactory(Architecture.EMBER);
        CPU cpu = factory.createCPU();
    }
}

Clase Cliente

Referencias

https://sourcemaking.com/design_patterns/abstract_factory

Abstract Factory

By sebastianvallejoroldan

Abstract Factory

Creational design Pattern

  • 332