Sobes.tech
Middle

Mücərrəd fabrik nümunəsinin tətbiqi nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Abstract Factory nümunəsi, qarşılıqlı əlaqəli və ya asılı obyekt ailələrini yaratmaq üçün interfeys təmin edir, onların konkret siniflərini göstərmədən.

Əsas komponentlər:

  1. Abstract Factory: Əsas məhsulların yaradılması əməliyyatları üçün interfeys elan edir.
  2. Concrete Factory: Konkret məhsul ailəsi üçün abstrakt məhsulların yaradılması əməliyyatlarını həyata keçirir.
  3. Abstract Product: Məhsul növü üçün interfeys elan edir.
  4. Concrete Product: Konkret məhsul üçün Abstract Product interfeysini həyata keçirir.
  5. Client: Abstract Factory və Abstract Product interfeyslərindən istifadə edir, lakin Concrete Factory və Concrete Product haqqında məlumatı yoxdur.

Tətbiq:

  • Hər məhsul növü üçün yaradılma metodları olan abstrakt fabrik müəyyən edilir.
  • Hər məhsul ailəsi üçün, müvafiq konkret məhsulları yaradan, abstrakt fabriki həyata keçirən konkret fabrik yaradılır.
  • Hər məhsul növü üçün abstrakt interfeys müəyyən edilir.
  • Hər konkret məhsul üçün uyğun interfeysi həyata keçirən sinif yaradılır.
  • Müştəri kodu, abstrakt fabrik obyektini alır və onun metodlarını çağıraraq məhsulları yaradır, yalnız məhsul interfeysləri ilə işləyir.
// Abstrakt fabrik
public interface IAbstractFactory
{
    IAbstractProductA CreateProductA();
    IAbstractProductB CreateProductB();
}

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

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

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

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

// Abstrakt məhsul A
public interface IAbstractProductA
{
    string UsefulFunctionA();
}

// Konkret məhsul A1
public class ConcreteProductA1 : IAbstractProductA
{
    public string UsefulFunctionA()
    {
        return "A1 məhsulunun nəticəsi.";
    }
}

// Konkret məhsul A2
public class ConcreteProductA2 : IAbstractProductA
{
    public string UsefulFunctionA()
    {
        return "A2 məhsulunun nəticəsi.";
    }
}

// Abstrakt məhsul B
public interface IAbstractProductB
{
    string UsefulFunctionB();
    string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}

// Konkret məhsul B1
public class ConcreteProductB1 : IAbstractProductB
{
    public string UsefulFunctionB()
    {
        return "B1 məhsulunun nəticəsi.";
    }

    // B1 məhsulu yalnız eyni variant A məhsulları ilə işləyə bilər
    public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();
        return $"B1-in ({result}) ilə əməkdaşlıq nəticəsi";
    }
}

// Konkret məhsul B2
public class ConcreteProductB2 : IAbstractProductB
{
    public string UsefulFunctionB()
    {
        return "B2 məhsulunun nəticəsi.";
    }

    // B2 məhsulu yalnız eyni variant A məhsulları ilə işləyə bilər
    public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();
        return $"B2-in ({result}) ilə əməkdaşlıq nəticəsi";
    }
}

// Müştəri kodu
public class Client
{
    public void Main()
    {
        // Müştəri kodu abstrakt fabrik ilə işləyir
        Console.WriteLine("Müştəri: Birinci fabrik növü ilə müştəri kodunu sınaqdan keçirir:");
        ClientMethod(new ConcreteFactory1());
        Console.WriteLine();

        Console.WriteLine("Müştəri: Eyni müştəri kodunu ikinci fabrik növü ilə sınaqdan keçirir:");
        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));
    }
}