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.
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.
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.
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
https://sourcemaking.com/design_patterns/abstract_factory