Sobes.tech
Middle

Абстракттуу фабрика үлгүсүнүн ишке ашырылышы эмнеде?

sobes.tech AI

AIден жооп

Абстракттуу фабрика интерфейсин өз ара байланышкан же өз ара көзкаранды объекттердин үй-бүлөлөрүн түзүү үчүн камсыз кылат, алардын конкреттүү класстарын көрсөтпөстөн.

Негизги компоненттер:

  1. Abstract Factory: Абстракттык продукттарды түзүү операциялары үчүн интерфейсди жарыялайт.
  2. Concrete Factory: Конкреттүү продукттар үй-бүлөсү үчүн абстракттык фабрика операцияларын ишке ашырат.
  3. Abstract Product: Продукттун түрү үчүн интерфейсди жарыялайт.
  4. Concrete Product: Конкреттүү продукт үчүн Abstract Product интерфейсин ишке ашырат.
  5. Client: Abstract Factory жана Abstract Product интерфейстерин колдонуп, бирок Concrete Factory жана Concrete Product жөнүндө билбейт.

Ишке ашыруу:

  • Ар бир продукт түрү үчүн түзүүчү методдор менен абстракттык фабрика аныкталат.
  • Ар бир продукт үй-бүлөсү үчүн, тиешелүү конкреттүү продукттарды түзүүчү методдорду ишке ашыруучү конкреттүү фабрика түзүлөт.
  • Ар бир продукт түрү үчүн абстракттык продукт интерфейси аныкталат.
  • Ар бир конкреттүү продукт үчүн, тиешелүү продукт интерфейсин ишке ашыруучү класс түзүлөт.
  • Клиенттик бөлүм абстракттык фабрика объектисин алат жана анын методдорун колдонуп продукттарды түзөт, тек гана продукт интерфейстер менен иштейт.
// Абстракттык фабрика
public interface IAbstractFactory
{
    IAbstractProductA CreateProductA();
    IAbstractProductB CreateProductB();
}

// Конкреттүү фабрика 1
public class ConcreteFactory1 : IAbstractFactory
{
    public IAbstractProductA CreateProductA()
    {
        return new ConcreteProductA1();
    }

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

// Конкреттүү фабрика 2
public class ConcreteFactory2 : IAbstractFactory
{
    public IAbstractProductA CreateProductA()
    {
        return new ConcreteProductA2();
    }

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

// Абстракттык продукт A
public interface IAbstractProductA
{
    string UsefulFunctionA();
}

// Конкреттүү продукт A1
public class ConcreteProductA1 : IAbstractProductA
{
    public string UsefulFunctionA()
    {
        return "The result of the product A1.";
    }
}

// Конкреттүү продукт A2
public class ConcreteProductA2 : IAbstractProductA
{
    public string UsefulFunctionA()
    {
        return "The result of the product A2.";
    }
}

// Абстракттык продукт B
public interface IAbstractProductB
{
    string UsefulFunctionB();
    string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}

// Конкреттүү продукт B1
public class ConcreteProductB1 : IAbstractProductB
{
    public string UsefulFunctionB()
    {
        return "The result of the product B1.";
    }

    // B1 продукту гана ошол эле варианттагы A продукттар менен иштей алат
    public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();
        return $"The result of the B1 collaborating with the ({result})";
    }
}

// Конкреттүү продукт B2
public class ConcreteProductB2 : IAbstractProductB
{
    public string UsefulFunctionB()
    {
        return "The result of the product B2.";
    }

    // B2 продукту гана ошол эле варианттагы A продукттар менен иштей алат
    public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();
        return $"The result of the B2 collaborating with the ({result})";
    }
}

// Клиенттик код
public class Client
{
    public void Main()
    {
        // Клиенттик код абстракттык фабрика менен иштейт
        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));
    }
}