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

Что такое фабричный паттерн?

1.0 Junior🔥 151 комментариев
#ООП и паттерны проектирования

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

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

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

Фабричный паттерн проектирования

Фабричный паттерн (Factory Pattern) — это порождающий паттерн проектирования, который предоставляет интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов. Основная цель — инкапсулировать логику создания объектов, делая систему гибкой, расширяемой и соответствующей принципу инверсии зависимостей (Dependency Inversion).

Ключевые преимущества и цели

  • Инкапсуляция создания объектов: Логика создания скрыта от клиентского кода.
  • Гибкость и расширяемость: Легко добавлять новые типы продуктов без изменения существующего кода.
  • Соблюдение принципа открытости/закрытости: Код открыт для расширения, но закрыт для модификации.
  • Упрощение поддержки: Изменения в процессе создания локализованы в одном месте.
  • Улучшение тестируемости: Позволяет использовать моки и стабы в unit-тестах.

Типы фабричных паттернов

В C# принято выделять три основных варианта:

1. Простая фабрика (Simple Factory)

Не является полноценным паттерном из GoF, но широко используется на практике как фабричный метод.

public interface IProduct
{
    string Operation();
}

public class ConcreteProductA : IProduct
{
    public string Operation() => "Результат ConcreteProductA";
}

public class ProductFactory
{
    public IProduct CreateProduct(string type)
    {
        return type switch
        {
            "A" => new ConcreteProductA(),
            "B" => new ConcreteProductB(),
            _ => throw new ArgumentException("Неизвестный тип продукта")
        };
    }
}

// Использование
var factory = new ProductFactory();
IProduct product = factory.CreateProduct("A");
Console.WriteLine(product.Operation());

2. Фабричный метод (Factory Method)

Определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанциировать.

public abstract class Creator
{
    public abstract IProduct FactoryMethod();
    
    public string SomeOperation()
    {
        var product = FactoryMethod();
        return $"Creator: {product.Operation()}";
    }
}

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

// Использование
Creator creator = new ConcreteCreatorA();
IProduct product = creator.FactoryMethod();

3. Абстрактная фабрика (Abstract Factory)

Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов без указания их конкретных классов.

public interface IAbstractFactory
{
    IProductA CreateProductA();
    IProductB CreateProductB();
}

public class ConcreteFactory1 : IAbstractFactory
{
    public IProductA CreateProductA() => new ConcreteProductA1();
    public IProductB CreateProductB() => new ConcreteProductB1();
}

// Использование
IAbstractFactory factory = new ConcreteFactory1();
IProductA productA = factory.CreateProductA();
IProductB productB = factory.CreateProductB();

Практическое применение в C# Backend

В backend-разработке на C# фабричные паттерны находят широкое применение:

  1. Создание репозиториев и сервисов:
public interface IRepositoryFactory
{
    IUserRepository CreateUserRepository();
    IOrderRepository CreateOrderRepository();
}
  1. Работа с различными провайдерами данных:
public interface IDatabaseFactory
{
    IDbConnection CreateConnection();
    ICommand CreateCommand();
}
  1. Генерация стратегий обработки запросов:
public class PaymentProcessorFactory
{
    public IPaymentProcessor CreateProcessor(PaymentType type)
    {
        return type switch
        {
            PaymentType.CreditCard => new CreditCardProcessor(),
            PaymentType.PayPal => new PayPalProcessor(),
            PaymentType.Crypto => new CryptoProcessor(),
            _ => throw new NotSupportedException()
        };
    }
}
  1. Создание логгеров с разными назначениями:
public interface ILoggerFactory
{
    ILogger CreateFileLogger(string path);
    ILogger CreateDatabaseLogger(string connectionString);
    ILogger CreateCloudLogger(string endpoint);
}

Сравнение с другими паттернами

  • В отличие от Строителя (Builder): Фабрика создает объекты за один шаг, тогда как Строитель использует поэтапное конструирование сложных объектов.
  • В отличие от Прототипа (Prototype): Фабрика создает новые объекты "с нуля", а Прототип клонирует существующие.
  • В отличие от Одиночки (Singleton): Фабрика может создавать множество экземпляров, тогда как Одиночка гарантирует один экземпляр.

Заключение

Фабричный паттерн — это фундаментальный инструмент в арсенале C# разработчика, который позволяет создавать гибкие, поддерживаемые и тестируемые системы. Правильное применение фабрик уменьшает связанность между компонентами, способствует соблюдению SOLID принципов и упрощает адаптацию системы к изменяющимся требованиям бизнеса. В современных .NET приложениях фабрики часто сочетаются с Dependency Injection контейнерами, что создает мощную инфраструктуру для управления зависимостями и жизненным циклом объектов.

Что такое фабричный паттерн? | PrepBro