Ответ
Паттерны проектирования — это типовые, проверенные решения часто встречающихся проблем в архитектуре ПО. Их знание позволяет писать более гибкий, поддерживаемый и понятный код.
Основные категории и ключевые паттерны:
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: Инкапсулирует запрос как объект, позволяя параметризовать клиентов с различными запросами, ставить запросы в очередь или логировать их.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶