Введение в паттерны проектирования
Дмитрий БахтенковЧто такое паттерны?
Паттерн представляет определенный способ построения программного кода для решения часто встречающихся проблем проектирования. В данном случае предполагается, что есть некоторый набор общих формализованных проблем, которые довольно часто встречаются, и паттерны предоставляют ряд принципов для решения этих проблем.

Почему мы должны ими пользоваться?
При проектировании и написании программ мы можем встретиться с определёнными проблемами. Чтобы их решить, можно формализовать проблему в виде классов, объектов и связей между ними и подобрать подходящий шаблон проектирования. У такого подхода есть несколько преимуществ:
- Не надо придумывать "костыли" и "велосипеды". Паттерн - это всего лишь шаблон, который мы можем подстроить под определённую проблему. Такие шаблоны уже давно придуманы за нас и являются хорошей практикой программирования.
- Использование паттернов упрощает групповую разработку программ. Зная применяемый шаблон проектирования и его основные принципы, другой программист сможет легко разобраться в его реализации и понять ваш говнокод.
А когда не использовать?
Не стоит применять паттерн только потому, что вам этого хочется. Если вы выучили новый шаблон - не пихайте его в каждый ваш проект. Неоправданное использование шаблонов проектирования может привести к усложнению кода и снижению его качества. Паттерн должен решать проблему, а не создавать новую.
Типы паттернов
Существует множество различных паттернов, которые решают разные проблемы и выполняют различные задачи. В основу классификации основных паттернов положена цель или задачи, которые определенный паттерн выполняет.
Порождающие паттерны
Порождающие паттерны - это шаблоны, которые абстрагируют процесс порождения классов и объектов. Их следует использовать, когда мы хотим получать различные объекты в зависимости от определённых условий.
Поведенческие паттерны
Поведенческие паттерны определяют логику взаимодействия между классами и объектами, то есть их поведение.
Структурные паттерны
Структурные паттерны определяют, как классы и объекты образуют более крупные структуры - более сложные классы и объекты.
Как выбрать нужный паттерн?
- Выделите все используемые сущности (классы) и связи (отношения) между ними.
- Попытайтесь абстрагировать их от конкретной ситуации, рассмотрите проблему в более общем виде.
- Определите суть решаемой задачи.
3.1 Если проблема заключается в том, что нам надо получать новые объекты на основе каких-то условий - рассмотрите порождающие паттерны.
3.2 Если нам нужно объединить функционал множества объектов - попробуйте структурные паттерны.
3.3 Если вам необходимо гибко определять поведение программы или её модулей (классов, объектов) - тут вам могут помочь поведенческие паттерны.
Не используйте только один единственный паттерн - попробуйте разные, чтобы выявить наилучшее решение проблемы.
Что почитать?
Для любителей статей покороче:
Для любителей книг:
- Приемы объектно-ориентированного проектирования. Паттерны проектирования
- Сергей Тепляков: Паттерны проектирования на платформе .NET