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

Шаблон проектирования (паттерн, от ) — повторяемая архитектурная конструкция в сфере проектирования программного обеспечения, предлагающая решение проблемы проектирования в рамках некоторого часто возникающего контекста.

Обычно шаблон не является законченным образцом, который может быть прямо преобразован в код; это лишь пример решения задачи, который можно использовать в различных ситуациях. Объектно-ориентированные шаблоны показывают отношения и взаимодействия между классами или объектами, без определения того, какие конечные классы или объекты приложения будут использоваться

«Низкоуровневые» шаблоны, учитывающие специфику конкретного языка программирования, называются идиомами. Это хорошие решения проектирования, характерные для конкретного языка или программной платформы, и потому не универсальные.

На наивысшем уровне существуют архитектурные шаблоны, они охватывают собой архитектуру всей программной системы.

Алгоритмы по своей сути также являются шаблонами, но не проектирования, а вычисления, так как решают вычислительные задачи.

История 
В 1970-е годы архитектор Кристофер Александер составил набор шаблонов проектирования. В области архитектуры эта идея не получила такого развития, как позже в области программной разработки.

В 1987 году Кент Бэк (Kent Beck) и Вард Каннингем (Ward Cunningham) взяли идеи Александера и разработали шаблоны применительно к разработке программного обеспечения для разработки графических оболочек на языке Smalltalk.

В 1988 году Эрих Гамма (Erich Gamma) начал писать докторскую диссертацию при Цюрихском университете об общей переносимости этой методики на разработку программ.

В 1989—1991 годах Джеймс Коплин (James Coplien) трудился над разработкой идиом для программирования на C++ и опубликовал в 1991 году книгу «Advanced C++ Idioms».

В этом же году Эрих Гамма заканчивает свою докторскую диссертацию и переезжает в США, где в сотрудничестве с Ричардом Хелмом (Richard Helm), Ральфом Джонсоном (Ralph Johnson) и Джоном Влиссидесом (John Vlissides) публикует книгу Design Patterns — Elements of Reusable Object-Oriented Software. В этой книге описаны 23 шаблона проектирования.
Также команда авторов этой книги известна общественности под названием «Банда четырёх» (, часто сокращается до GoF). Именно эта книга стала причиной роста популярности шаблонов проектирования.

Плюсы 
В сравнении с полностью самостоятельным проектированием, шаблоны обладают рядом преимуществ. Основная польза от использования шаблонов состоит в снижении сложности разработки за счёт готовых абстракций для решения целого класса проблем. Шаблон даёт решению своё имя, что облегчает коммуникацию между разработчиками, позволяя ссылаться на известные шаблоны. Таким образом, за счёт шаблонов производится унификация деталей решений: модулей, элементов проекта, — снижается количество ошибок. Применение шаблонов концептуально сродни использованию готовых библиотек кода. Правильно сформулированный шаблон проектирования позволяет, отыскав удачное решение, пользоваться им снова и снова. Набор шаблонов помогает разработчику выбрать возможный, наиболее подходящий вариант проектирования.

Минусы 
Хотя легкое изменение кода под известный шаблон может упростить понимание кода, по мнению Стива Макконнелла, с применением шаблонов могут быть связаны две сложности. Во-первых, слепое следование некоторому выбранному шаблону может привести к усложнению программы. Во-вторых, у разработчика может возникнуть желание попробовать некоторый шаблон в деле без особых оснований (см Золотой молоток).

Многие шаблоны проектирования в объектно-ориентированном проектировании можно рассматривать как идиоматическое воспроизведение элементов функциональных языков. Питер Норвиг утверждает, что 16 из 23 шаблонов, описанных в книге «Банды четырёх», в динамически-типизируемых языках реализуются существенно проще, чем в C++, либо оказываются незаметны. Пол Грэхэм считает саму идею шаблонов проектирования — антипаттерном, сигналом о том, что система не обладает достаточным уровнем абстракции, и необходима её тщательная переработка. Нетрудно видеть, что само определение шаблона как «готового решения, но не прямого обращения к библиотеке» по сути означает отказ от повторного использования в пользу дублирования. Это, очевидно, может быть неизбежным для сложных систем при использовании языков, не поддерживающих комбинаторы и полиморфизм типов, и это в принципе может быть исключено в языках, обладающих свойством гомоиконичности (хотя и не обязательно эффективно), так как любой шаблон может быть реализован в виде исполнимого кода.

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

Основные

Частные

Шаблоны параллельного программирования 
Используются для более эффективного написания многопоточных программ, и предоставляет готовые решения проблем синхронизации.

Шаблоны генерации объектов 
 Singleton
 Factory Method
 Abstract Factory
 Prototype

Шаблоны программирования гибких объектов 
 Composite
 Decorator
 Facade

Шаблоны выполнения задач 
 Interpreter
 Strategy
 Observer
 Visitor
 Command

Шаблоны архитектуры системы 

 Model-View-Controller (MVC) Модель-представление-контроллер.
 Model-View-Presenter.
 Model-View-ViewModel.
 .
 Naked objects.
 Hierarchical Model-View-Controller.
 View-Interactor-Presenter-Entity-Routing (VIPER).

Enterprise 
 Active Record — способ доступа к данным реляционных баз данных в объектно-ориентированном программировании.
 Business Delegate.
 Composite Entity/Составная Сущность.
 Composite View.
 DAO (Data Access Object) Объект Доступа к Данным.
 Dispatcher View.
 Front Controller.
 Intercepting Filter.
 Registry.
 Service Activator.
 Service Locator/Локатор Служб.
 Service to Worker.
 Session Facade/Фасад Сессии.
 Transfer Object Assembler.
 Transfer Object/Объект Перемещения.
 Value List Handler/Обработчик Списка Значений.
 View Helper.
 Unit of Work.

Шаблоны проектирования потоковой обработки 
 Обработка событий по отдельности
 Обработка с использованием локального состояния
 Многоэтапная обработка/повторное разделение на разделы
 Обработка с применением внешнего справочника: соединение потока данных с таблицей
 Соединение потоков данных
 Внеочередные события
 Повторная обработка

Шаблоны проектирования распределённых систем

Шаблоны Баз Данных 
 Data Mapper
 Identity Map
 Unit of Work
 Lazy Load

Прочие 
 Repository/Хранилище.

Другие типы шаблонов 
Также на сегодняшний день существует ряд других шаблонов.
 Carrier Rider Mapper описывают предоставление доступа к хранимой информации.
 Аналитические шаблоны описывают основной подход для составления требований для программного обеспечения (requirement analysis) до начала самого процесса программной разработки.
 Коммуникационные шаблоны описывают процесс общения между отдельными участниками/сотрудниками организации.
 Организационные шаблоны описывают организационную иерархию предприятия/фирмы
 Антипаттерны (Anti-Design-Patterns) описывают, как не следует поступать при разработке программ, показывая характерные ошибки в дизайне и в реализации.

См. также 
 Антипаттерн
 Дизайн-манифест
 Обобщённое программирование
 Шаблоны C++
 Шаблоны J2EE
 CQRS
 Dependency Injection
 Книга «Design Patterns» (от создателей шаблонов проектирования)
 GRASP
 UML

Примечания

Литература

Ссылки 
 
 Portland Pattern Repository — список шаблонов проектирования на движке вики
 Структурные шаблоны проектирования в XML
 Eclipse’s Culture of Shipping Erich Gamma