Какие знаешь порождающие архитектурные паттерны?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Порождающие архитектурные паттерны
Порождающие паттерны — это шаблоны проектирования, которые абстрагируют и оптимизируют процесс создания объектов, делая систему независимой от способа создания, композиции и представления объектов. В контексте архитектуры C# Backend, они особенно важны для управления зависимостями, тестируемости и поддержки кода.
Основные порождающие паттерны
1. Singleton (Одиночка)
Обеспечивает наличие только одного экземпляра класса в приложении, предоставляя глобальную точку доступа к нему. Широко используется для логирования, конфигурации, кэширования или пулов соединений.
public sealed class Logger
{
private static Logger _instance;
private static readonly object _lock = new object();
private Logger() { }
public static Logger Instance
{
get
{
lock (_lock)
{
if (_instance == null)
_instance = new Logger();
return _instance;
}
}
}
public void Log(string message) => Console.WriteLine(message);
}
Ключевое: потокобезопасная реализация через lock в C#. В современных приложениях часто заменяется на DI-контейнеры с регистрацией как Singleton.
2. Factory Method (Фабричный метод)
Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, экземпляр какого класса создавать. Позволяет делегировать создание объектов наследникам.
public abstract class Document
{
public abstract void Open();
}
public class PdfDocument : Document
{
public override void Open() => Console.WriteLine("Opening PDF...");
}
public abstract class Application
{
public abstract Document CreateDocument();
public void NewDocument() => CreateDocument().Open();
}
public class PdfApplication : Application
{
public override Document CreateDocument() => new PdfDocument();
}
Применение: в плагинных архитектурах или при работе с различными реализациями абстракций (например, подключение к разным типам БД).
3. Abstract Factory (Абстрактная фабрика)
Предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов. Полезен при поддержке различных тем UI, кроссплатформенных библиотек.
public interface IUIFactory
{
IButton CreateButton();
ICheckbox CreateCheckbox();
}
public class WindowsUIFactory : IUIFactory
{
public IButton CreateButton() => new WindowsButton();
public ICheckbox CreateCheckbox() => new WindowsCheckbox();
}
Преимущество: согласованность объектов — все созданные объекты принадлежат одному семейству.
4. Builder (Строитель)
Отделяет конструирование сложного объекта от его представления, позволяя использовать один и тот же процесс построения для создания разных представлений. Идеален для объектов со множеством опциональных параметров.
public class Report
{
public string Title { get; set; }
public string Body { get; set; }
public string Footer { get; set; }
}
public class ReportBuilder
{
private Report _report = new Report();
public ReportBuilder SetTitle(string title)
{
_report.Title = title;
return this;
}
public Report Build() => _report;
}
// Использование: new ReportBuilder().SetTitle("Test").Build();
Особенно полезен для иммутабельных объектов и потокового API (Fluent Interface).
5. Prototype (Прототип)
Позволяет создавать новые объекты путем копирования существующих (прототипов), вместо создания через конструктор. В C# реализуется через интерфейс ICloneable или кастомное клонирование.
public class Circle : ICloneable
{
public int Radius { get; set; }
public object Clone() => this.MemberwiseClone(); // Поверхностное копирование
}
Используется при высокой стоимости создания объектов (например, загрузка данных из БД) или при необходимости быстрого копирования состояний.
Практическое применение в C# Backend
В современных backend-приложениях на C# порождающие паттерны часто интегрируются с Dependency Injection (DI):
- Singleton регистрируется в DI-контейнере (например, в ASP.NET Core
services.AddSingleton<IService, Service>()). - Factory Method и Abstract Factory помогают создавать объекты с зависимостями, управляемыми контейнером.
- Builder применяется для конфигурации (например,
HostBuilder,ConfigurationBuilderв .NET Core).
Эти паттерны снижают связность (coupling), повышают тестируемость через моки и стабы, и способствуют соблюдению принципа единственной ответственности (SRP). Выбор конкретного паттерна зависит от сложности создания объектов, необходимости контроля над процессом и требований к гибкости архитектуры.