📌 Какие есть паттерны проектирования?



💬 Спрашивают в 55% собеседований



Паттерны проектирования (Design Patterns) — это проверенные решения общих проблем проектирования программного обеспечения. Они описывают шаблоны, которые можно применять в различных контекстах для решения типичных задач. Паттерны проектирования можно классифицировать на три основные категории: порождающие, структурные и поведенческие. Рассмотрим каждый из них подробнее:



🤔 Порождающие паттерны (Creational Patterns)



Эти паттерны касаются процесса создания объектов, помогая сделать этот процесс более гибким и эффективным.



1️⃣ Singleton (Одиночка): Обеспечивает создание только одного экземпляра класса и предоставляет глобальную точку доступа к этому экземпляру.

2️⃣ Factory Method (Фабричный метод): Определяет интерфейс для создания объекта, но позволяет подклассам изменять тип создаваемого объекта.

3️⃣ Abstract Factory (Абстрактная фабрика): Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов без указания их конкретных классов.

4️⃣Builder (Строитель): Разделяет процесс построения сложного объекта от его представления, позволяя использовать один и тот же процесс создания для различных представлений.

5️⃣ Prototype (Прототип): Создает новые объекты копированием существующих объектов (прототипов).



🤔 Структурные паттерны (Structural Patterns)



Эти паттерны описывают способы компоновки объектов и классов для формирования более крупных структур.



1️⃣Adapter (Адаптер): Позволяет объектам с несовместимыми интерфейсами работать вместе.

2️⃣Bridge (Мост): Разделяет абстракцию и реализацию так, чтобы они могли изменяться независимо.

3️⃣Composite (Компоновщик): Составляет объекты в древовидные структуры для представления иерархий часть-целое.

4️⃣Decorator (Декоратор): Динамически добавляет новые обязанности объекту, не изменяя его класс.

5️⃣ Facade (Фасад): Предоставляет простой интерфейс к сложной системе классов или к библиотеке классов.

6️⃣ Flyweight (Приспособленец): Позволяет использовать большое количество мелких объектов, экономя память путем совместного использования общего состояния.

7️⃣ Proxy (Заместитель): Предоставляет суррогат или заменитель другого объекта для контроля доступа к нему.



🤔 Поведенческие паттерны (Behavioral Patterns)



Эти паттерны касаются алгоритмов и распределения обязанностей между объектами.



1️⃣ Chain of Responsibility (Цепочка обязанностей): Передает запрос по цепочке обработчиков, где каждый обработчик решает, обрабатывать ли запрос или передать его дальше.

2️⃣ Command (Команда): Инкапсулирует запрос как объект, позволяя параметризовать клиентов с различными запросами, ставить запросы в очередь или вести журнал запросов.

3️⃣Interpreter (Интерпретатор): Определяет грамматику для языка и интерпретирует предложения этого языка.

4️⃣ Iterator (Итератор): Предоставляет способ последовательного доступа ко всем элементам агрегированного объекта без раскрытия его внутреннего представления.

5️⃣ Mediator (Посредник): Обеспечивает объект, который инкапсулирует взаимодействие множества объектов, снижая зависимость между ними.

6️⃣ Memento (Снимок): Позволяет сохранять и восстанавливать прошлое состояние объекта без нарушения инкапсуляции.

7️⃣ Observer (Наблюдатель): Определяет зависимость один-ко-многим между объектами, так что при изменении состояния одного объекта все зависимые объекты оповещаются и обновляются автоматически.

8️⃣State (Состояние): Позволяет объекту изменять свое поведение при изменении его внутреннего состояния.

9️⃣ Strategy (Стратегия): Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.

1️⃣0️⃣ Template Method (Шаблонный метод): Определяет скелет алгоритма в методе, оставляя определенные шаги подклассам.

1️⃣1️⃣ Visitor (Посетитель): Разделяет алгоритм от структуры объекта, позволяя добавлять новые операции без изменения классов объектов, над которыми эти операции выполняются.