Sobes.tech
Middle

Kā īstenot abstraktās rūpnīcas modeli?

sobes.tech AI

Atbilde no AI

Abstraktā rūpnīca nodrošina saskarni, lai izveidotu savienotas vai atkarīgas objektu ģimenes, ne norādot to konkrētās klases.

Galvenās sastāvdaļas:

  1. Abstract Factory: Izsludina saskarni abstraktu produktu izveidošanas operācijām.
  2. Concrete Factory: Realizē konkrētas ģimenes produktu izveidošanas operācijas.
  3. Abstract Product: Izsludina saskarni produkta tipam.
  4. Concrete Product: Realizē Abstract Product saskarni konkrētam produktam.
  5. Client: Izmanto Abstract Factory un Abstract Product saskarnes, bet nezin par Concrete Factory un Concrete Product.

Īstenošana:

  • Definēta abstrakta rūpnīca ar metodēm katra produkta veida izveidei.
  • Katrai produktu ģimenei tiek izveidota konkrēta rūpnīca, kas īsteno abstraktās rūpnīcas metodes un izveido atbilstošus konkrētus produktus.
  • Katram produkta veidam tiek noteikta abstrakta produkta saskarne.
  • Katram konkrētam produktam tiek izveidota klase, kas īsteno atbilstošo produkta saskarni.
  • Klienta kods saņem abstraktās rūpnīcas objektu un izsauc tās metodes produktu izveidei, strādājot tikai ar produktu saskarnēm.
// Abstraktā rūpnīca
public interface IAbstractFactory
{
    IAbstractProductA CreateProductA();
    IAbstractProductB CreateProductB();
}

// Konkrētā rūpnīca 1
public class ConcreteFactory1 : IAbstractFactory
{
    public IAbstractProductA CreateProductA()
    {
        return new ConcreteProductA1();
    }

    public IAbstractProductB CreateProductB()
    {
        return new ConcreteProductB1();
    }
}

// Konkrētā rūpnīca 2
public class ConcreteFactory2 : IAbstractFactory
{
    public IAbstractProductA CreateProductA()
    {
        return new ConcreteProductA2();
    }

    public IAbstractProductB CreateProductB()
    {
        return new ConcreteProductB2();
    }
}

// Abstrakts produkts A
public interface IAbstractProductA
{
    string UsefulFunctionA();
}

// Konkrētais produkts A1
public class ConcreteProductA1 : IAbstractProductA
{
    public string UsefulFunctionA()
    {
        return "The result of the product A1.";
    }
}

// Konkrētais produkts A2
public class ConcreteProductA2 : IAbstractProductA
{
    public string UsefulFunctionA()
    {
        return "The result of the product A2.";
    }
}

// Abstrakts produkts B
public interface IAbstractProductB
{
    string UsefulFunctionB();
    string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}

// Konkrētais produkts B1
public class ConcreteProductB1 : IAbstractProductB
{
    public string UsefulFunctionB()
    {
        return "The result of the product B1.";
    }

    // B1 produkts var strādāt tikai ar A produktiem tā paša varianta
    public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();
        return $"The result of the B1 collaborating with the ({result})";
    }
}

// Konkrētais produkts B2
public class ConcreteProductB2 : IAbstractProductB
{
    public string UsefulFunctionB()
    {
        return "The result of the product B2.";
    }

    // B2 produkts var strādāt tikai ar A produktiem tā paša varianta
    public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();
        return $"The result of the B2 collaborating with the ({result})";
    }
}

// Klienta kods
public class Client
{
    public void Main()
    {
        // Klienta kods strādā ar abstraktu rūpnīcu
        Console.WriteLine("Client: Testing client code with the first factory type:");
        ClientMethod(new ConcreteFactory1());
        Console.WriteLine();

        Console.WriteLine("Client: Testing the same client code with the second factory type:");
        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));
    }
}