Sobes.tech
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:

  1. Abstract Factory: Declara la interfaz para las operaciones de creación de productos abstractos.
  2. Concrete Factory: Implementa las operaciones de creación de productos abstractos para una familia concreta de productos.
  3. Abstract Product: Declara la interfaz para un tipo de producto.
  4. Concrete Product: Implementa la interfaz del producto abstracto para un producto concreto.
  5. 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));
    }
}