Middle
¿En qué consiste la implementación del patrón de fábrica abstracta?
sobes.tech AI
Respuesta de la IA
El patrón Abstract Factory proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.
Componentes principales:
- Abstract Factory: Declara la interfaz para las operaciones de creación de productos abstractos.
- Concrete Factory: Implementa las operaciones de creación de productos abstractos para una familia concreta de productos.
- Abstract Product: Declara la interfaz para un tipo de producto.
- Concrete Product: Implementa la interfaz del producto abstracto para un producto concreto.
- Client: Usa las interfaces de Abstract Factory y Abstract Product, pero no conoce la Concrete Factory ni la Concrete Product.
Implementación:
- Se define una fábrica abstracta con métodos para crear cada tipo de producto.
- Para cada familia de productos, se crea una fábrica concreta que implementa los métodos de la fábrica abstracta y crea los productos concretos correspondientes.
- Para cada tipo de producto, se define una interfaz de producto abstracto.
- Para cada producto concreto, se crea una clase que implementa la interfaz correspondiente.
- La parte cliente obtiene un objeto de la fábrica abstracta y llama a sus métodos para crear productos, trabajando solo con las interfaces de los productos.
// Fábrica abstracta
public interface IAbstractFactory
{
IAbstractProductA CreateProductA();
IAbstractProductB CreateProductB();
}
// Fábrica concreta 1
public class ConcreteFactory1 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
// Fábrica concreta 2
public class ConcreteFactory2 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
// Producto abstracto A
public interface IAbstractProductA
{
string UsefulFunctionA();
}
// Producto concreto A1
public class ConcreteProductA1 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "El resultado del producto A1.";
}
}
// Producto concreto A2
public class ConcreteProductA2 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "El resultado del producto A2.";
}
}
// Producto abstracto B
public interface IAbstractProductB
{
string UsefulFunctionB();
string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}
// Producto concreto B1
public class ConcreteProductB1 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "El resultado del producto B1.";
}
// El producto B1 solo puede trabajar con productos A del mismo tipo
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"El resultado del B1 colaborando con el ({result})";
}
}
// Producto concreto B2
public class ConcreteProductB2 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "El resultado del producto B2.";
}
// El producto B2 solo puede trabajar con productos A del mismo tipo
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"El resultado del B2 colaborando con el ({result})";
}
}
// Código cliente
public class Client
{
public void Main()
{
// El código cliente trabaja con la fábrica abstracta
Console.WriteLine("Cliente: Probando código cliente con el primer tipo de fábrica:");
ClientMethod(new ConcreteFactory1());
Console.WriteLine();
Console.WriteLine("Cliente: Probando el mismo código cliente con el segundo tipo de fábrica:");
ClientMethod(new ConcreteFactory2());
}
public void ClientMethod(IAbstractFactory factory)
{
var productA = factory.CreateProductA();
var productB = factory.CreateProductB();
Console.WriteLine(productB.UsefulFunctionB());
Console.WriteLine(productB.AnotherUsefulFunctionB(productA));
}
}