# Шаблоны проектирования

Это способ решения периодически возникающих проблем. Точнее, это руководства по решению конкретных проблем. Это не классы, пакеты или библиотеки, которые вы можете вставить в своё приложение и ожидать волшебства.

\
&#x20;В программной инженерии шаблон проектирования приложений — это многократно применяемое решение регулярно возникающей проблемы в рамках определённого контекста архитектуры приложения. Шаблон — это не законченное архитектурное решение, которое можно напрямую преобразовать в исходный или машинный код. Это описание подхода к решению проблемы, который можно применять в разных ситуациях.

·         Шаблоны проектирования — не «серебряная пуля».

·         Не пытайтесь внедрять их принудительно, последствия могут быть негативными. Помните, что шаблоны — это способы **решения**, а не **поиска** проблем. Так что не перемудрите.

·         Если применять их правильно и в нужных местах, они могут оказаться спасением. В противном случае у вас будет ещё больше проблем.

Виды шаблонов проектирования

·         Порождающие

·         Структурные

·         Поведенческие

**Отношения между классами**

* ![](https://habrastorage.org/getpro/habr/post_images/ca8/dca/2a5/ca8dca2a537a1ec8044e88984c3f8b02.png) — агрегация (aggregation) — описывает связь «часть»–«целое», в котором «часть» может существовать отдельно от «целого». Ромб указывается со стороны «целого».\ <br>
* ![](https://habrastorage.org/getpro/habr/post_images/4de/b17/e66/4deb17e6696fc05e610d73ca47b1a49a.png) — композиция (composition) — подвид агрегации, в которой «части» не могут существовать отдельно от «целого».\ <br>
* ![](https://habrastorage.org/getpro/habr/post_images/43b/4e7/9ac/43b4e79ac9d10a4f8b57859b019c7c24.png) — зависимость (dependency) — изменение в одной сущности (независимой) может влиять на состояние или поведение другой сущности (зависимой). Со стороны стрелки указывается независимая сущность.\ <br>
* ![](https://habrastorage.org/getpro/habr/post_images/aa6/efe/a5f/aa6efea5f552569c7fa6ce4e5603e684.png) — обобщение (generalization) — отношение наследования или реализации интерфейса. Со стороны стрелки находится суперкласс или интерфейс.

**Виды паттернов**

* ![](https://habrastorage.org/getpro/habr/post_images/262/c9e/d92/262c9ed9247e232f099d35de841bf5d9.png) — поведенческие (behavioral);\ <br>
* ![](https://habrastorage.org/getpro/habr/post_images/8fd/16f/b0f/8fd16fb0fc58c0dc3291abe1d98abb12.png) — порождающие (creational);\ <br>
* ![](https://habrastorage.org/getpro/habr/post_images/3d2/c67/1bf/3d2c671bfcaa92b6a7ee0eb185247dc8.png) — структурные (structural).\ <br>

**Список шаблонов**

![](https://habrastorage.org/getpro/habr/post_images/349/055/ba9/349055ba96e21b43c7d3e506d4920bc8.jpg)
