El patrón de diseño Abstract Factory proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.
Aquí hay un ejemplo simple en Java:
Interfaz Abstracta de Productos:
// Interfaz abstracta para los productos de una familia
interface ProductoA {
void operacionA();
}
interface ProductoB {
void operacionB();
}
Implementación Concreta de Productos:
// Implementación concreta de productos de la familia A
class ProductoConcretoA implements ProductoA {
@Override
public void operacionA() {
System.out.println("Operación en ProductoConcretoA");
}
}
// Implementación concreta de productos de la familia B
class ProductoConcretoB implements ProductoB {
@Override
public void operacionB() {
System.out.println("Operación en ProductoConcretoB");
}
}
Interfaz Abstracta de Fábrica:
// Interfaz abstracta que declara métodos para crear productos de una familia
interface FabricaAbstracta {
ProductoA crearProductoA();
ProductoB crearProductoB();
}
Implementación Concreta de la Fábrica:
// Implementación concreta de la interfaz abstracta de fábrica
class FabricaConcreta implements FabricaAbstracta {
@Override
public ProductoA crearProductoA() {
return new ProductoConcretoA();
}
@Override
public ProductoB crearProductoB() {
return new ProductoConcretoB();
}
}
Uso de la Abstract Factory:
public class Main {
public static void main(String[] args) {
// Crear una instancia de la fábrica concreta
FabricaAbstracta fabrica = new FabricaConcreta();
// Utilizar la fábrica para crear productos de la familia A
ProductoA productoA = fabrica.crearProductoA();
productoA.operacionA();
// Utilizar la fábrica para crear productos de la familia B
ProductoB productoB = fabrica.crearProductoB();
productoB.operacionB();
}
}
Cuándo utilizar el patrón Abstract Factory:
- Creación de Familias de Objetos Relacionados: Utiliza el patrón Abstract Factory cuando necesitas crear una familia de objetos relacionados o dependientes, y quieres asegurarte de que estos objetos sean compatibles entre sí.
- Configuración de Varias Variantes de Productos: Si tu sistema necesita ser configurado con múltiples variantes de productos, el Abstract Factory proporciona una interfaz para crear esas variantes sin exponer las implementaciones concretas a la clase cliente.
- Desacoplamiento entre Clientes y Productos Concretos: Cuando deseas desacoplar a los clientes de las clases concretas de los productos, permitiendo que las familias de productos cambien sin afectar a los clientes.
El patrón Abstract Factory es especialmente útil en situaciones donde se espera que el sistema evolucione para soportar nuevas familias de productos. Proporciona una estructura modular y extensible para gestionar estas variantes.
Factory Method:
- Propósito:
- El Factory Method se centra en proporcionar una interfaz para la creación de un solo producto.
- Delega la creación de objetos a las subclases, permitiendo que una clase cliente use la interfaz para crear instancias de una familia de objetos relacionados.
- Estructura:
- Incluye una interfaz o clase abstracta con un método Factory Method que las subclases implementan para crear objetos concretos.
- Cada subclase puede proporcionar una implementación diferente del Factory Method para crear instancias diferentes de un producto.
- Ejemplo:
- En el ejemplo anterior del Factory Method, la interfaz
Fabrica
tiene el métodocrearProducto()
que las subclases implementan.
- En el ejemplo anterior del Factory Method, la interfaz
Abstract Factory:
- Propósito:
- El Abstract Factory se centra en proporcionar una interfaz para crear familias de productos relacionados o dependientes.
- Permite la creación de múltiples productos que están diseñados para trabajar juntos.
- Estructura:
- Incluye una interfaz o clase abstracta con varios métodos Factory Method, cada uno dedicado a crear un tipo específico de producto.
- Las subclases implementan la interfaz Abstract Factory para crear productos compatibles entre sí.
- Ejemplo:
- En el ejemplo del Abstract Factory, la interfaz
FabricaAbstracta
tiene dos métodos,crearProductoA()
ycrearProductoB()
, para crear productos de dos familias diferentes.
- En el ejemplo del Abstract Factory, la interfaz
Diferencias Clave:
- Número de Productos:
- Factory Method se centra en un solo producto.
- Abstract Factory se centra en familias de productos relacionados.
- Complejidad:
- Factory Method es más simple y tiene una estructura más plana.
- Abstract Factory puede ser más complejo, ya que implica la creación de múltiples tipos de productos que deben ser compatibles entre sí.
- Relaciones entre Productos:
- Factory Method no garantiza que los productos creados sean compatibles o pertenezcan a una familia específica.
- Abstract Factory garantiza que los productos creados por una fábrica son compatibles entre sí.
- Flexibilidad:
- Factory Method es más flexible en términos de agregar nuevas subclases para crear nuevos productos.
- Abstract Factory es más flexible en términos de agregar nuevas familias de productos.
En resumen, el Factory Method se utiliza cuando se necesita delegar la creación de un solo producto a las subclases, mientras que el Abstract Factory se utiliza cuando se necesitan crear familias de productos relacionados o dependientes. La elección entre ellos dependerá de los requisitos específicos del diseño y la arquitectura del sistema.