Sobes.tech
Middle
128
questionbank

В чем заключается реализация паттерна абстрактной фабрики?

Answer from AI

sobes.tech AI

Реализация паттерна "Фабрика" (Factory Method) заключается в создании интерфейса для создания объектов, но предоставлении подклассам возможности решать, какой именно класс будет создан.

Ключевые элементы:

  • Creator (Создатель): Объявляет фабричный метод, который возвращает объект типа Product. Creator может также определять реализацию по умолчанию фабричного метода, которая возвращает объект Product по умолчанию.
  • ConcreteCreator (Конкретный Создатель): Переопределяет фабричный метод для возвращения экземпляра ConcreteProduct.
  • Product (Продукт): Определяет интерфейс объектов, создаваемых фабричным методом.
  • ConcreteProduct (Конкретный Продукт): Реализует интерфейс Product.

Пример UML:

graph TD
    A[Creator] --> B[+ FactoryMethod(): Product]
    B --> C[Product]
    A --> D[ConcreteCreator]
    D --> E[+ FactoryMethod(): Product]
    E --> F[ConcreteProduct]
    C --> F
    D .> F

Пример на C#:

// Product
public interface IProduct
{
    string Operation();
}

// ConcreteProduct A
public class ConcreteProductA : IProduct
{
    public string Operation()
    {
        return "Result of ConcreteProductA";
    }
}

// ConcreteProduct B
public class ConcreteProductB : IProduct
{
    public string Operation()
    {
        return "Result of ConcreteProductB";
    }
}

// Creator
public abstract class Creator
{
    // Фабричный метод
    public abstract IProduct FactoryMethod();

    // Может содержать логику, использующую фабричный метод
    public string SomeOperation()
    {
        IProduct product = FactoryMethod();
        return $"Creator: The same creator's code has just worked with {product.Operation()}";
    }
}

// ConcreteCreator A
public class ConcreteCreatorA : Creator
{
    public override IProduct FactoryMethod()
    {
        return new ConcreteProductA();
    }
}

// ConcreteCreator B
public class ConcreteCreatorB : Creator
{
    public override IProduct FactoryMethod()
    {
        return new ConcreteProductB();
    }
}

В этом примере, Creator определяет шаблон для создания IProduct, но конкретную реализацию (ConcreteProductA или ConcreteProductB) выбирают подклассы ConcreteCreatorA и ConcreteCreatorB путем переопределения метода FactoryMethod. Это позволяет клиентам использовать Creator и его подклассы, не зная конкретных типов создаваемых объектов, что обеспечивает гибкость и расширяемость системы.