← Назад к вопросам

Приведи пример использования абстрактной фабрики

1.0 Junior🔥 82 комментариев
#Другое

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример использования паттерна Абстрактная Фабрика в C#

Паттерн Абстрактная Фабрика используется для создания семейств взаимосвязанных или взаимозависимых объектов без привязки к их конкретным классам. Это особенно полезно, когда система должна быть независима от способа создания, композиции и представления её объектов.

Контекст примера: Кроссплатформенный UI

Представим, что мы разрабатываем кроссплатформенное приложение, которое должно работать как на Windows, так и на macOS. Нам нужно создавать элементы интерфейса (кнопки, текстовые поля), которые будут выглядеть и вести себя соответственно стилям каждой ОС.

Шаг 1: Определяем абстрактные продукты

Сначала определим интерфейсы для наших продуктов (UI-элементов):

// Абстрактный продукт A: Кнопка
public interface IButton
{
    void Render();
    void OnClick();
}

// Абстрактный продукт B: Текстовое поле
public interface ITextBox
{
    void Render();
    string GetText();
    void SetText(string text);
}

Шаг 2: Создаем конкретные продукты для каждой платформы

Реализуем конкретные классы для Windows:

public class WindowsButton : IButton
{
    public void Render()
    {
        Console.WriteLine("Отрисовка кнопки в стиле Windows (с прямоугольными краями)");
    }

    public void OnClick()
    {
        Console.WriteLine("Обработка клика в стиле Windows");
    }
}

public class WindowsTextBox : ITextBox
{
    private string _text = "";

    public void Render()
    {
        Console.WriteLine($"Отрисовка текстового поля Windows с текстом: {_text}");
    }

    public string GetText() => _text;

    public void SetText(string text)
    {
        _text = text;
        Console.WriteLine($"Текст в Windows текстовом поле изменен на: {text}");
    }
}

Реализуем конкретные классы для macOS:

public class MacButton : IButton
{
    public void Render()
    {
        Console.WriteLine("Отрисовка кнопки в стиле macOS (с закругленными краями)");
    }

    public void OnClick()
    {
        Console.WriteLine("Обработка клика в стиле macOS");
    }
}

public class MacTextBox : ITextBox
{
    private string _text = "";

    public void Render()
    {
        Console.WriteLine($"Отрисовка текстового поля macOS с текстом: {_text}");
    }

    public string GetText() => _text;

    public void SetText(string text)
    {
        _text = text;
        Console.WriteLine($"Текст в macOS текстовом поле изменен на: {text}");
    }
}

Шаг 3: Создаем абстрактную фабрику

Определяем интерфейс фабрики, который объявляет методы создания всех продуктов семейства:

public interface IUIFactory
{
    IButton CreateButton();
    ITextBox CreateTextBox();
}

Шаг 4: Реализуем конкретные фабрики

Создаем фабрики для каждой платформы:

public class WindowsUIFactory : IUIFactory
{
    public IButton CreateButton() => new WindowsButton();
    public ITextBox CreateTextBox() => new WindowsTextBox();
}

public class MacUIFactory : IUIFactory
{
    public IButton CreateButton() => new MacButton();
    public ITextBox CreateTextBox() => new MacTextBox();
}

Шаг 5: Клиентский код

Клиентский код работает с фабриками и продуктами через абстрактные интерфейсы:

public class Application
{
    private readonly IButton _button;
    private readonly ITextBox _textBox;

    public Application(IUIFactory factory)
    {
        // Клиентский код не знает конкретных классов продуктов
        _button = factory.CreateButton();
        _textBox = factory.CreateTextBox();
    }

    public void RenderUI()
    {
        _button.Render();
        _textBox.Render();
    }

    public void SimulateUserInteraction()
    {
        _textBox.SetText("Привет, мир!");
        _button.OnClick();
    }
}

Шаг 6: Использование

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Запуск приложения для Windows:");
        IUIFactory windowsFactory = new WindowsUIFactory();
        Application windowsApp = new Application(windowsFactory);
        windowsApp.RenderUI();
        windowsApp.SimulateUserInteraction();

        Console.WriteLine("\n---\n");

        Console.WriteLine("Запуск приложения для macOS:");
        IUIFactory macFactory = new MacUIFactory();
        Application macApp = new Application(macFactory);
        macApp.RenderUI();
        macApp.SimulateUserInteraction();
    }
}

Преимущества и выводы

Ключевые преимущества использования паттерна Абстрактная Фабрика в этом примере:

  • Изоляция конкретных классов: Клиентский код (Application) не зависит от конкретных классов UI-элементов
  • Согласованность продуктов: Гарантируется, что все созданные объекты принадлежат одному семейству (все либо Windows, либо macOS)
  • Упрощение замены семейств продуктов: Для смены платформы достаточно изменить фабрику на другую
  • Соблюдение принципа открытости/закрытости: Можно добавлять новые семейства продуктов без изменения существующего кода

Типичные сценарии применения:

  • Системы, которые должны быть независимы от способа создания объектов
  • Системы, конфигурируемые одним из множества семейств объектов
  • Когда нужно обеспечить согласованность взаимосвязанных объектов

Этот паттерн особенно полезен в крупных приложениях, где важна единообразная стилистика и возможность легкого переключения между различными темами, платформами или стилями оформления.

Приведи пример использования абстрактной фабрики | PrepBro