Sobes.tech
Middle

Kuo skiriasi abstrakčiosios gamyklos modelio įgyvendinimas?

sobes.tech AI

Atsakymas iš AI

Abstraktiųjų gamyklų modelis pateikia sąsają, skirtą šeimoms tarpusavyje susijusių arba priklausomų objektų kūrimui, ne nurodant jų konkrečių klasių.

Pagrindiniai komponentai:

  1. Abstract Factory: Skelbia sąsają, skirtą abstrakčių produktų kūrimo operacijoms.
  2. Concrete Factory: Įgyvendina konkrečios šeimos produktų kūrimo operacijas.
  3. Abstract Product: Skelbia sąsają, skirtą produkto tipui.
  4. Concrete Product: Įgyvendina Abstract Product sąsają konkrečiam produktui.
  5. Client: Naudoja Abstract Factory ir Abstract Product sąsajas, bet nežino apie Concrete Factory ir Concrete Product.

Įgyvendinimas:

  • Apibrėžiama abstrakti gamykla su metodais kiekvieno produkto tipo kūrimui.
  • Kiekvienai produktų šeimai kuriama konkreti gamykla, įgyvendinanti abstrakčios gamyklos metodus ir kurianti atitinkamus konkrečius produktus.
  • Kiekvieno produkto tipui nustatoma abstrakti produkto sąsaja.
  • Kiekvienam konkrečiam produktui kuriama klasė, įgyvendinanti atitinkamą produkto sąsają.
  • Kliento kodas gauna abstrakčios gamyklos objektą ir kviečia jos metodus produktų kūrimui, dirbdamas tik su produktų sąsajomis.
// Abstrakti gamykla
public interface IAbstractFactory
{
    IAbstractProductA CreateProductA();
    IAbstractProductB CreateProductB();
}

// Konkreti gamykla 1
public class ConcreteFactory1 : IAbstractFactory
{
    public IAbstractProductA CreateProductA()
    {
        return new ConcreteProductA1();
    }

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

// Konkreti gamykla 2
public class ConcreteFactory2 : IAbstractFactory
{
    public IAbstractProductA CreateProductA()
    {
        return new ConcreteProductA2();
    }

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

// Abstraktus produktas A
public interface IAbstractProductA
{
    string UsefulFunctionA();
}

// Konkretaus produkto A1
public class ConcreteProductA1 : IAbstractProductA
{
    public string UsefulFunctionA()
    {
        return "The result of the product A1.";
    }
}

// Konkretaus produkto A2
public class ConcreteProductA2 : IAbstractProductA
{
    public string UsefulFunctionA()
    {
        return "The result of the product A2.";
    }
}

// Abstraktus produktas B
public interface IAbstractProductB
{
    string UsefulFunctionB();
    string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}

// Konkretaus produkto B1
public class ConcreteProductB1 : IAbstractProductB
{
    public string UsefulFunctionB()
    {
        return "The result of the product B1.";
    }

    // B1 produktas gali dirbti tik su A produktų tuo pačiu variantu
    public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();
        return $"The result of the B1 collaborating with the ({result})";
    }
}

// Konkretaus produkto B2
public class ConcreteProductB2 : IAbstractProductB
{
    public string UsefulFunctionB()
    {
        return "The result of the product B2.";
    }

    // B2 produktas gali dirbti tik su A produktų tuo pačiu variantu
    public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();
        return $"The result of the B2 collaborating with the ({result})";
    }
}

// Kliento kodas
public class Client
{
    public void Main()
    {
        // Kliento kodas dirba su abstrakčia gamykla
        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));
    }
}