Какие знаешь паттерны проектирования?

«Какие знаешь паттерны проектирования?» — вопрос из категории Паттерны, который задают на 43% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерны проектирования — это типовые, проверенные решения часто встречающихся проблем в архитектуре ПО. Их знание позволяет писать более гибкий, поддерживаемый и понятный код.

Основные категории и ключевые паттерны:

1. Порождающие (Creational)

Управляют процессом создания объектов.

  • Singleton: Гарантирует существование только одного экземпляра класса.
    public sealed class Logger
    {
        private static readonly Lazy<Logger> _instance = new Lazy<Logger>(() => new Logger());
        public static Logger Instance => _instance.Value;
        private Logger() { } // Приватный конструктор
        public void Log(string message) => Console.WriteLine($"[{DateTime.Now}] {message}");
    }
    // Использование: Logger.Instance.Log("Запуск приложения");
  • Factory Method: Определяет интерфейс для создания объекта, но позволяет подклассам изменять тип создаваемого объекта.
  • Abstract Factory: Создает семейства связанных объектов без указания их конкретных классов.

2. Структурные (Structural)

Отвечают за компоновку классов и объектов в более крупные структуры.

  • Adapter: Позволяет объектам с несовместимыми интерфейсами работать вместе. Например, адаптер для старой библиотеки логирования под новый интерфейс ILogger.
  • Composite: Позволяет сгруппировать объекты в древовидные структуры и работать с ними как с единым объектом (например, элементы UI: Panel, Button, TextBox).
  • Decorator: Динамически добавляет объекту новую функциональность, оборачивая его. Альтернатива наследованию.

3. Поведенческие (Behavioral)

Решают задачи эффективного взаимодействия и распределения ответственности между объектами.

  • Observer: Определяет зависимость "один-ко-многим" между объектами так, что при изменении состояния одного объекта все зависящие от него объекты уведомляются. Реализуется через события (event) в C#.
  • Strategy: Инкапсулирует алгоритм (стратегию) в отдельный класс, делая их взаимозаменяемыми.

    public interface ISortStrategy<T> { void Sort(List<T> list); }
    public class QuickSortStrategy<T> : ISortStrategy<T> { /* ... */ }
    public class MergeSortStrategy<T> : ISortStrategy<T> { /* ... */ }
    
    public class Sorter<T>
    {
        private ISortStrategy<T> _strategy;
        public void SetStrategy(ISortStrategy<T> strategy) => _strategy = strategy;
        public void ExecuteSort(List<T> list) => _strategy?.Sort(list);
    }
  • Command: Инкапсулирует запрос как объект, позволяя параметризовать клиентов с различными запросами, ставить запросы в очередь или логировать их.

Видео-ответы