Что такое фабричный паттерн?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Фабричный паттерн проектирования
Фабричный паттерн (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# фабричные паттерны находят широкое применение:
- Создание репозиториев и сервисов:
public interface IRepositoryFactory
{
IUserRepository CreateUserRepository();
IOrderRepository CreateOrderRepository();
}
- Работа с различными провайдерами данных:
public interface IDatabaseFactory
{
IDbConnection CreateConnection();
ICommand CreateCommand();
}
- Генерация стратегий обработки запросов:
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()
};
}
}
- Создание логгеров с разными назначениями:
public interface ILoggerFactory
{
ILogger CreateFileLogger(string path);
ILogger CreateDatabaseLogger(string connectionString);
ILogger CreateCloudLogger(string endpoint);
}
Сравнение с другими паттернами
- В отличие от Строителя (Builder): Фабрика создает объекты за один шаг, тогда как Строитель использует поэтапное конструирование сложных объектов.
- В отличие от Прототипа (Prototype): Фабрика создает новые объекты "с нуля", а Прототип клонирует существующие.
- В отличие от Одиночки (Singleton): Фабрика может создавать множество экземпляров, тогда как Одиночка гарантирует один экземпляр.
Заключение
Фабричный паттерн — это фундаментальный инструмент в арсенале C# разработчика, который позволяет создавать гибкие, поддерживаемые и тестируемые системы. Правильное применение фабрик уменьшает связанность между компонентами, способствует соблюдению SOLID принципов и упрощает адаптацию системы к изменяющимся требованиям бизнеса. В современных .NET приложениях фабрики часто сочетаются с Dependency Injection контейнерами, что создает мощную инфраструктуру для управления зависимостями и жизненным циклом объектов.