Шаблон проектирования
Шаблон проектирования (паттерн, от англ. design pattern) — повторяемая архитектурная конструкция в сфере проектирования программного обеспечения, предлагающая решение проблемы проектирования в рамках некоторого часто возникающего контекста.
Обычно шаблон не является законченным образцом, который может быть прямо преобразован в код; это лишь пример решения задачи, который можно использовать в различных ситуациях. Объектно-ориентированные шаблоны показывают отношения и взаимодействия между классами или объектами, без определения того, какие конечные классы или объекты приложения будут использоваться.
"Низкоуровневые" шаблоны, учитывающие специфику конкретного языка программирования, называются идиомами. Это хорошие решения проектирования, характерные для конкретного языка или программной платформы, и потому не универсальные.
На наивысшем уровне существуют архитектурные шаблоны, они охватывают собой архитектуру всей программной системы.
Алгоритмы по своей сути также являются шаблонами, но не проектирования, а вычисления, так как решают вычислительные задачи.
История
В 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 шаблона проектирования. Также команда авторов этой книги известна общественности под названием «Банда четырёх» (англ. Gang of Four, часто сокращается до GoF). Именно эта книга стала причиной роста популярности шаблонов проектирования.
Плюсы
В сравнении с полностью самостоятельным проектированием шаблоны обладают рядом преимуществ. Основная польза от использования шаблонов состоит в снижении сложности разработки за счёт готовых абстракций для решения целого класса проблем. Шаблон даёт решению своё имя, что облегчает коммуникацию между разработчиками, позволяя ссылаться на известные шаблоны. Таким образом, за счёт шаблонов производится унификация деталей решений: модулей, элементов проекта, — снижается количество ошибок. Применение шаблонов концептуально сродни использованию готовых библиотек кода. Правильно сформулированный шаблон проектирования позволяет, отыскав удачное решение, пользоваться им снова и снова. Набор шаблонов помогает разработчику выбрать возможный, наиболее подходящий вариант проектирования.
Минусы
Хотя легкое изменение кода под известный шаблон может упростить понимание кода, по мнению Стива Макконнелла, с применением шаблонов могут быть связаны две сложности. Во-первых, слепое следование некоторому выбранному шаблону может привести к усложнению программы. Во-вторых, у разработчика может возникнуть желание попробовать некоторый шаблон в деле без особых оснований (см. Золотой молоток).
Многие шаблоны проектирования в объектно-ориентированном проектировании можно рассматривать как идиоматическое воспроизведение элементов функциональных языков. Питер Норвиг утверждает, что 16 из 23 шаблонов, описанных в книге «Банды четырёх», в динамически-типизируемых языках реализуются существенно проще, чем в C++, либо оказываются незаметны. Пол Грэхэм считает саму идею шаблонов проектирования — антипаттерном, сигналом о том, что система не обладает достаточным уровнем абстракции, и необходима её тщательная переработка. Нетрудно видеть, что само определение шаблона как «готового решения, но не прямого обращения к библиотеке» по сути означает отказ от повторного использования в пользу дублирования. Это, очевидно, может быть неизбежным для сложных систем при использовании языков, не поддерживающих комбинаторы и полиморфизм типов, и это в принципе может быть исключено в языках, обладающих свойством гомоиконичности (хотя и не обязательно эффективно), так как любой шаблон может быть реализован в виде исполнимого кода.
Типы шаблонов проектирования
Основные
| Название | Оригинальное название | Описание | Описан в Design Patterns |
|---|---|---|---|
| Основные шаблоны (Fundamental) | |||
| Шаблон делегирования | Delegation pattern | Объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. | н/д |
| Шаблон функционального дизайна | Functional design | Гарантирует, что каждый модуль компьютерной программы имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие части программы. | н/д |
| Неизменяемый интерфейс | Immutable interface | Создание неизменяемого объекта. | н/д |
| Интерфейс | Interface | Общий метод для структурирования компьютерных программ для того, чтобы их было проще понять. | н/д |
| Интерфейс-маркер | Marker interface | В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого могут применяться атрибуты или аннотации. | н/д |
| Контейнер свойств | Property container | Позволяет добавлять дополнительные свойства для класса в контейнер (внутри класса), вместо расширения класса новыми свойствами. | н/д |
| Канал событий | Event channel | Расширяет шаблон «издатель — подписчик», создавая централизованный канал для событий. Использует объект-представитель для подписки и объект-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одного объекта, даже если он зарегистрирован только на одном канале. | н/д |
| Порождающие шаблоны (Creational) — шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту. | |||
| Абстрактная фабрика | Abstract factory | Класс, который представляет собой интерфейс для создания компонентов системы. | Да |
| Строитель | Builder | Класс, который представляет собой интерфейс для создания сложного объекта. | Да |
| Фабричный метод | Factory method | Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать. | Да |
| Отложенная инициализация | Lazy initialization | Объект, инициализируемый во время первого обращения к нему. | Нет |
| Мультитон | Multiton | Гарантирует, что класс имеет поименованные экземпляры объекта и обеспечивает глобальную точку доступа к ним. | Нет |
| Объектный пул | Object pool | Класс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов. | Нет |
| Прототип | Prototype | Определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор. | Да |
| Получение ресурса есть инициализация | Resource acquisition is initialization (RAII) | Получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта. | Нет |
| Одиночка | Singleton | Класс, который может иметь только один экземпляр. | Да |
| Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу. | |||
| Адаптер | Adapter / Wrapper | Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс. | Да |
| Мост | Bridge | Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо. | Да |
| Компоновщик | Composite | Объект, который объединяет в себе объекты, подобные ему самому. | Да |
| Декоратор или Wrapper/Обёртка | Decorator | Класс, расширяющий функциональность другого класса без использования наследования. | Да |
| Фасад | Facade | Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое. | Да |
| Единая точка входа | Front controller | Обеспечивает унифицированный интерфейс для интерфейсов в подсистеме. Front Controller определяет высокоуровневый интерфейс, упрощающий использование подсистемы. | Нет |
| Приспособленец | Flyweight | Это объект, представляющий себя как уникальный экземпляр в разных местах программы, но фактически не являющийся таковым. | Да |
| Заместитель | Proxy | Объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него. | Да |
| Поведенческие шаблоны (Behavioral) определяют взаимодействие между объектами, увеличивая таким образом его гибкость. | |||
| Цепочка обязанностей | Chain of responsibility | Предназначен для организации в системе уровней ответственности. | Да |
| Команда, Action, Transaction | Command | Представляет действие. Объект команды заключает в себе само действие и его параметры. | Да |
| Интерпретатор | Interpreter | Решает часто встречающуюся, но подверженную изменениям, задачу. | Да |
| Итератор, Cursor | Iterator | Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из объектов, входящих в состав агрегации. | Да |
| Посредник | Mediator | Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга. | Да |
| Хранитель | Memento | Позволяет не нарушая инкапсуляцию зафиксировать и сохранить внутренние состояния объекта так, чтобы позднее восстановить его в этих состояниях. | Да |
| Null Object | Null Object | Предотвращает нулевые указатели, предоставляя объект «по умолчанию». | Нет |
| Наблюдатель или Издатель — подписчик | Observer | Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии. | Да |
| [англ.] | Servant | Используется для обеспечения общей функциональности группе классов. | Нет |
| Спецификация | Specification | Служит для связывания бизнес-логики. | Нет |
| Состояние | State | Используется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния. | Да |
| Стратегия | Strategy | Предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. | Да |
| Шаблонный метод | Template method | Определяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом. | Да |
| Посетитель | Visitor | Описывает операцию, которая выполняется над объектами других классов. При изменении класса Visitor нет необходимости изменять обслуживаемые классы. | Да |
| Simple Policy | Нет | ||
| Event listener | Нет | ||
| [англ.] | Single-serving visitor | Оптимизирует реализацию шаблона посетитель, который инициализируется, единожды используется, и затем удаляется. | Нет |
| [англ.] | Hierarchical visitor | Предоставляет способ обхода всех вершин иерархической структуры данных (напр. древовидной). | Нет |
Частные
Шаблоны параллельного программирования
Используются для более эффективного написания многопоточных программ, и предоставляет готовые решения проблем синхронизации.
| Название | Оригинальное название | Описание |
|---|---|---|
| Активный объект | Active object | Служит для отделения потока выполнения метода от потока, в котором он был вызван. Использует шаблоны асинхронный вызов методов и планировщик. |
| [англ.] | Balking | Служит для выполнения действия над объектом только тогда, когда тот находится в корректном состоянии. |
| [англ.] | Binding properties | Комбинирует несколько наблюдателей для обеспечения синхронизации свойств в различных объектах. |
| [англ.] | Messaging pattern, Messaging design pattern (MDP) | Позволяет компонентам и приложениям обмениваться информацией (сообщениями). |
| Блокировка с двойной проверкой | Double checked locking | Предназначен для уменьшения накладных расходов, связанных с получением блокировки. |
| [англ.] | Event-Based Asynchronous | Адресные проблемы с Асинхронным паттерном, которые возникают в программах с несколькими потоками. |
| [англ.] | Guarded suspension | Используется для блокировки выполнения действия над объектом только тогда, когда тот находится в корректном состоянии. |
| Блокировка | Lock | Один поток блокирует ресурс для предотвращения доступа или изменения его другими потоками. |
| Монитор | Monitor | Объект, предназначенный для безопасного использования более чем одним потоком. |
| Реактор | Reactor | Предназначен для синхронной передачи запросов сервису от одного или нескольких источников. |
| Блокировка чтения-записи[англ.] | Read/write lock | Позволяет нескольким потокам одновременно считывать информацию из общего хранилища, но позволяя только одному потоку в текущий момент времени её изменять. |
| Планировщик | Scheduler | Обеспечивает механизм реализации политики планирования, но при этом не зависящих ни от одной конкретной политики. |
| [англ.] | Предоставляет пул потоков для обработки заданий, представленных обычно в виде очереди. | |
| [англ.] | Служит для предоставления различных глобальных переменных для разных потоков. | |
| Однопоточное выполнение | Single thread execution | Препятствует конкурентному вызову метода, тем самым запрещая параллельное выполнение этого метода. |
| Cooperative pattern | Обеспечивает механизм безопасной остановки потоков исполнения, используя общий флаг для сигнализирования прекращения работы потоков. |
Шаблоны генерации объектов
- 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.
- (VIPER).
Enterprise
- Active Record — способ доступа к данным реляционных баз данных в объектно-ориентированном программировании.
- .
- .
- .
- DAO (Data Access Object) Объект Доступа к Данным.
- .
- .
- .
- .
- .
- Service Locator/Локатор Служб.
- .
- .
- .
- .
- .
- .
- .
Шаблоны проектирования потоковой обработки
Шаблоны проектирования распределённых систем
Шаблоны Баз Данных
- Data Mapper
- Identity Map
- Unit of Work
- Lazy Load
Прочие
- .
Другие типы шаблонов
Также на сегодняшний день существует ряд других шаблонов.
- описывают предоставление доступа к хранимой информации.
- описывают основной подход для составления требований для программного обеспечения (requirement analysis) до начала самого процесса программной разработки.
- описывают процесс общения между отдельными участниками/сотрудниками организации.
- описывают организационную иерархию предприятия/фирмы
- Антипаттерны (Anti-Design-Patterns) описывают, как не следует поступать при разработке программ, показывая характерные ошибки в дизайне и в реализации.
См. также
- Антипаттерн
- Дизайн-манифест
- Обобщённое программирование
- Шаблоны C++
- Шаблоны J2EE
- CQRS
- Dependency Injection
- Книга «Design Patterns» (от создателей шаблонов проектирования)
- GRASP
- UML
Примечания
- Макконнелл, 2005, с. 100—101.
- Макконнелл, 2005, с. 101.
- Design Patterns in Haskell. Дата обращения: 5 декабря 2014. Архивировано 13 декабря 2014 года.
- Peter Norvig — Design Patterns in Dynamic Languages (slides). Дата обращения: 5 декабря 2014. Архивировано 12 декабря 2014 года.
- Revenge of the Nerds. — «In the OO world you hear a good deal about "patterns". I wonder if these patterns are not sometimes evidence of case (c), the human compiler, at work. When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I'm using abstractions that aren't powerful enough-- often that I'm generating by hand the expansions of some macro that I need to write.» Дата обращения: 13 февраля 2015. Архивировано 7 июня 2019 года.
- Абельсон, Сассман. Структура и интерпретация компьютерных программ (SICP).. цитаты: «Можно строить абстракции процедур и данных, можно использовать функции высших порядков, чтобы охватить общие шаблоны их использования, … и можно с легкостью реализовывать встроенные языки.» (с.16); «Одна из тех вещей, которых мы должны требовать от мощного языка программирования — это возможность строить абстракции путём присвоения имен общим схемам, а затем прямо работать с этими абстракциями. … Часто одна и та же схема программы используется с различными процедурами. Для того чтобы выразить эти схемы как понятия, нам нужно строить процедуры, которые принимают другие процедуры как аргументы либо возвращают их как значения.» (с.70); «определение шаблонных схем в виде процедур служит средством абстракции.» (с.263); глава 4.1.5 «Данные как программы» (с.357-360); понятие о «средствах абстракции» и их роли дано на с.25.
- Binding Properties. Дата обращения: 10 марта 2011. Архивировано 11 апреля 2012 года.
- Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, and Morgan Skinner. Event-based Asynchronous Pattern // Professional C# 2008 (неопр.). — Wiley, 2008. — С. 570—571. — ISBN 9780470191378.
- Lock Pattern. Дата обращения: 10 марта 2011. Архивировано 23 октября 2012 года.
- Interview and Book Excerpt: Dan Haywood’s Domain-Driven Design Using Naked Objects. Дата обращения: 10 июля 2015. Архивировано 3 марта 2021 года.
Литература
- Zandstra M. PHP Objects, Patterns, and Practice. — 5th Edition. — «», 2016. — С. 583. — ISBN 978-1-4842-1995-9.
- Зандстра М. PHP. Объекты, шаблоны и методики программирования. — 5-е изд.. — СПб.: «», 2019. — С. 736. — ISBN 978-5-907144-54-5.
- Фаулер, Мартин. Рефакторинг кода на JavaScript: улучшение проекта существующего кода. — 2-е изд.. — СПб.: «», 2019. — С. 464. — ISBN 978-5-907144-59-0.
- Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования = PHP Objects, Patterns and Practice, Third Edition. — 3-е издание. — М.: «», 2015. — С. 368. — ISBN 978-5-496-00389-6.
- Джейсон Мак-Колм Смит. Элементарные шаблоны проектирования = Elemental Design Patterns. — М.: «», 2012. — 304 с. — ISBN 978-5-8459-1818-5.
- Фаулер, Мартин, Бек, Кент, Брант, Джон, Опдайк, Уильям, Робертс, Дон. Рефакторинг: улучшение проекта существующего кода. — М.: «», 2019. — 448 с. — ISBN 978-5-9909445-1-0.
- Мартин Фаулер. Шаблоны корпоративных приложений (Signature Series) = Patterns of Enterprise Application Architecture (Addison-Wesley Signature Series). — М.: «», 2012. — 544 с. — ISBN 978-5-8459-1611-2.
- Марк Гранд. Шаблоны проектирования в JAVA. Каталог популярных шаблонов проектирования, проиллюстрированных при помощи UML = Patterns in Java, Volume 1. A Catalog of Reusable Design Patterns Illustrated with UML. — М.: «», 2004. — С. 560. — ISBN 5-94735-047-5.
- Крэг Ларман. Применение UML 2.0 и шаблонов проектирования = Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development. — М.: «», 2006. — С. 736. — ISBN 0-13-148906-2.
- Стив Макконнелл. Совершенный код = Code complete. — СПб.: Питер, 2005. — С. 896. — (Мастер-класс). — ISBN 5-7502-0064-7, 5-469-00822-3.
Ссылки
- Ольга Дубина. Обзор паттернов проектирования. — Обзор нескольких наиболее значительных монографий, посвященных паттернам проектирования информационных систем. Дата обращения: 5 сентября 2006. Архивировано из оригинала 27 августа 2006 года.
- Portland Pattern Repository — список шаблонов проектирования на движке вики
- Структурные шаблоны проектирования в XML
- Eclipse’s Culture of Shipping (англ.) Erich Gamma
Для улучшения этой статьи желательно: |
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Шаблон проектирования, Что такое Шаблон проектирования? Что означает Шаблон проектирования?
U etogo termina sushestvuyut i drugie znacheniya sm Pattern Shablon proektirovaniya pattern ot angl design pattern povtoryaemaya arhitekturnaya konstrukciya v sfere proektirovaniya programmnogo obespecheniya predlagayushaya reshenie problemy proektirovaniya v ramkah nekotorogo chasto voznikayushego konteksta Obychno shablon ne yavlyaetsya zakonchennym obrazcom kotoryj mozhet byt pryamo preobrazovan v kod eto lish primer resheniya zadachi kotoryj mozhno ispolzovat v razlichnyh situaciyah Obektno orientirovannye shablony pokazyvayut otnosheniya i vzaimodejstviya mezhdu klassami ili obektami bez opredeleniya togo kakie konechnye klassy ili obekty prilozheniya budut ispolzovatsya Nizkourovnevye shablony uchityvayushie specifiku konkretnogo yazyka programmirovaniya nazyvayutsya idiomami Eto horoshie resheniya proektirovaniya harakternye dlya konkretnogo yazyka ili programmnoj platformy i potomu ne universalnye Na naivysshem urovne sushestvuyut arhitekturnye shablony oni ohvatyvayut soboj arhitekturu vsej programmnoj sistemy Algoritmy po svoej suti takzhe yavlyayutsya shablonami no ne proektirovaniya a vychisleniya tak kak reshayut vychislitelnye zadachi IstoriyaV 1970 e gody arhitektor Kristofer Aleksander sostavil nabor shablonov proektirovaniya V oblasti arhitektury eta ideya ne poluchila takogo razvitiya kak pozzhe v oblasti programmnoj razrabotki V 1987 godu Kent Bek Kent Beck i Vard Kanningem Ward Cunningham vzyali idei Aleksandera i razrabotali shablony primenitelno k razrabotke programmnogo obespecheniya dlya razrabotki graficheskih obolochek na yazyke Smalltalk V 1988 godu Erih Gamma Erich Gamma nachal pisat doktorskuyu dissertaciyu pri Cyurihskom universitete ob obshej perenosimosti etoj metodiki na razrabotku programm V 1989 1991 godah Dzhejms Koplin James Coplien trudilsya nad razrabotkoj idiom dlya programmirovaniya na C i opublikoval v 1991 godu knigu Advanced C Idioms V etom zhe godu Erih Gamma zakanchivaet svoyu doktorskuyu dissertaciyu i pereezzhaet v SShA gde v sotrudnichestve s Richardom Helmom Richard Helm Ralfom Dzhonsonom Ralph Johnson i Dzhonom Vlissidesom John Vlissides publikuet knigu Design Patterns Elements of Reusable Object Oriented Software V etoj knige opisany 23 shablona proektirovaniya Takzhe komanda avtorov etoj knigi izvestna obshestvennosti pod nazvaniem Banda chetyryoh angl Gang of Four chasto sokrashaetsya do GoF Imenno eta kniga stala prichinoj rosta populyarnosti shablonov proektirovaniya PlyusyV sravnenii s polnostyu samostoyatelnym proektirovaniem shablony obladayut ryadom preimushestv Osnovnaya polza ot ispolzovaniya shablonov sostoit v snizhenii slozhnosti razrabotki za schyot gotovyh abstrakcij dlya resheniya celogo klassa problem Shablon dayot resheniyu svoyo imya chto oblegchaet kommunikaciyu mezhdu razrabotchikami pozvolyaya ssylatsya na izvestnye shablony Takim obrazom za schyot shablonov proizvoditsya unifikaciya detalej reshenij modulej elementov proekta snizhaetsya kolichestvo oshibok Primenenie shablonov konceptualno srodni ispolzovaniyu gotovyh bibliotek koda Pravilno sformulirovannyj shablon proektirovaniya pozvolyaet otyskav udachnoe reshenie polzovatsya im snova i snova Nabor shablonov pomogaet razrabotchiku vybrat vozmozhnyj naibolee podhodyashij variant proektirovaniya MinusyHotya legkoe izmenenie koda pod izvestnyj shablon mozhet uprostit ponimanie koda po mneniyu Stiva Makkonnella s primeneniem shablonov mogut byt svyazany dve slozhnosti Vo pervyh slepoe sledovanie nekotoromu vybrannomu shablonu mozhet privesti k uslozhneniyu programmy Vo vtoryh u razrabotchika mozhet vozniknut zhelanie poprobovat nekotoryj shablon v dele bez osobyh osnovanij sm Zolotoj molotok Mnogie shablony proektirovaniya v obektno orientirovannom proektirovanii mozhno rassmatrivat kak idiomaticheskoe vosproizvedenie elementov funkcionalnyh yazykov Piter Norvig utverzhdaet chto 16 iz 23 shablonov opisannyh v knige Bandy chetyryoh v dinamicheski tipiziruemyh yazykah realizuyutsya sushestvenno proshe chem v C libo okazyvayutsya nezametny Pol Grehem schitaet samu ideyu shablonov proektirovaniya antipatternom signalom o tom chto sistema ne obladaet dostatochnym urovnem abstrakcii i neobhodima eyo tshatelnaya pererabotka Netrudno videt chto samo opredelenie shablona kak gotovogo resheniya no ne pryamogo obrasheniya k biblioteke po suti oznachaet otkaz ot povtornogo ispolzovaniya v polzu dublirovaniya Eto ochevidno mozhet byt neizbezhnym dlya slozhnyh sistem pri ispolzovanii yazykov ne podderzhivayushih kombinatory i polimorfizm tipov i eto v principe mozhet byt isklyucheno v yazykah obladayushih svojstvom gomoikonichnosti hotya i ne obyazatelno effektivno tak kak lyuboj shablon mozhet byt realizovan v vide ispolnimogo koda Tipy shablonov proektirovaniyaOsnovnye Nazvanie Originalnoe nazvanie Opisanie Opisan v Design PatternsOsnovnye shablony Fundamental Shablon delegirovaniya Delegation pattern Obekt vneshne vyrazhaet nekotoroe povedenie no v realnosti peredayot otvetstvennost za vypolnenie etogo povedeniya svyazannomu obektu n dShablon funkcionalnogo dizajna Functional design Garantiruet chto kazhdyj modul kompyuternoj programmy imeet tolko odnu obyazannost i ispolnyaet eyo s minimumom pobochnyh effektov na drugie chasti programmy n dNeizmenyaemyj interfejs Immutable interface Sozdanie neizmenyaemogo obekta n dInterfejs Interface Obshij metod dlya strukturirovaniya kompyuternyh programm dlya togo chtoby ih bylo proshe ponyat n dInterfejs marker Marker interface V kachestve atributa kak pometki obektnoj sushnosti primenyaetsya nalichie ili otsutstvie realizacii interfejsa markera V sovremennyh yazykah programmirovaniya vmesto etogo mogut primenyatsya atributy ili annotacii n dKontejner svojstv Property container Pozvolyaet dobavlyat dopolnitelnye svojstva dlya klassa v kontejner vnutri klassa vmesto rasshireniya klassa novymi svojstvami n dKanal sobytij Event channel Rasshiryaet shablon izdatel podpischik sozdavaya centralizovannyj kanal dlya sobytij Ispolzuet obekt predstavitel dlya podpiski i obekt predstavitel dlya publikacii sobytiya v kanale Predstavitel sushestvuet otdelno ot realnogo izdatelya ili podpischika Podpischik mozhet poluchat opublikovannye sobytiya ot bolee chem odnogo obekta dazhe esli on zaregistrirovan tolko na odnom kanale n dPorozhdayushie shablony Creational shablony proektirovaniya kotorye abstragiruyut process instancirovaniya Oni pozvolyayut sdelat sistemu nezavisimoj ot sposoba sozdaniya kompozicii i predstavleniya obektov Shablon porozhdayushij klassy ispolzuet nasledovanie chtoby izmenyat instanciruemyj klass a shablon porozhdayushij obekty delegiruet instancirovanie drugomu obektu Abstraktnaya fabrika Abstract factory Klass kotoryj predstavlyaet soboj interfejs dlya sozdaniya komponentov sistemy DaStroitel Builder Klass kotoryj predstavlyaet soboj interfejs dlya sozdaniya slozhnogo obekta DaFabrichnyj metod Factory method Opredelyaet interfejs dlya sozdaniya obekta no ostavlyaet podklassam reshenie o tom kakoj klass instancirovat DaOtlozhennaya inicializaciya Lazy initialization Obekt inicializiruemyj vo vremya pervogo obrasheniya k nemu NetMultiton Multiton Garantiruet chto klass imeet poimenovannye ekzemplyary obekta i obespechivaet globalnuyu tochku dostupa k nim NetObektnyj pul Object pool Klass kotoryj predstavlyaet soboj interfejs dlya raboty s naborom inicializirovannyh i gotovyh k ispolzovaniyu obektov NetPrototip Prototype Opredelyaet interfejs sozdaniya obekta cherez klonirovanie drugogo obekta vmesto sozdaniya cherez konstruktor DaPoluchenie resursa est inicializaciya Resource acquisition is initialization RAII Poluchenie nekotorogo resursa sovmeshaetsya s inicializaciej a osvobozhdenie s unichtozheniem obekta NetOdinochka Singleton Klass kotoryj mozhet imet tolko odin ekzemplyar DaStrukturnye shablony Structural opredelyayut razlichnye slozhnye struktury kotorye izmenyayut interfejs uzhe sushestvuyushih obektov ili ego realizaciyu pozvolyaya oblegchit razrabotku i optimizirovat programmu Adapter Adapter Wrapper Obekt obespechivayushij vzaimodejstvie dvuh drugih obektov odin iz kotoryh ispolzuet a drugoj predostavlyaet nesovmestimyj s pervym interfejs DaMost Bridge Struktura pozvolyayushaya izmenyat interfejs obrasheniya i interfejs realizacii klassa nezavisimo DaKomponovshik Composite Obekt kotoryj obedinyaet v sebe obekty podobnye emu samomu DaDekorator ili Wrapper Obyortka Decorator Klass rasshiryayushij funkcionalnost drugogo klassa bez ispolzovaniya nasledovaniya DaFasad Facade Obekt kotoryj abstragiruet rabotu s neskolkimi klassami obedinyaya ih v edinoe celoe DaEdinaya tochka vhoda Front controller Obespechivaet unificirovannyj interfejs dlya interfejsov v podsisteme Front Controller opredelyaet vysokourovnevyj interfejs uproshayushij ispolzovanie podsistemy NetPrisposoblenec Flyweight Eto obekt predstavlyayushij sebya kak unikalnyj ekzemplyar v raznyh mestah programmy no fakticheski ne yavlyayushijsya takovym DaZamestitel Proxy Obekt kotoryj yavlyaetsya posrednikom mezhdu dvumya drugimi obektami i kotoryj realizuet ogranichivaet dostup k obektu k kotoromu obrashayutsya cherez nego DaPovedencheskie shablony Behavioral opredelyayut vzaimodejstvie mezhdu obektami uvelichivaya takim obrazom ego gibkost Cepochka obyazannostej Chain of responsibility Prednaznachen dlya organizacii v sisteme urovnej otvetstvennosti DaKomanda Action Transaction Command Predstavlyaet dejstvie Obekt komandy zaklyuchaet v sebe samo dejstvie i ego parametry DaInterpretator Interpreter Reshaet chasto vstrechayushuyusya no podverzhennuyu izmeneniyam zadachu DaIterator Cursor Iterator Predstavlyaet soboj obekt pozvolyayushij poluchit posledovatelnyj dostup k elementam obekta agregata bez ispolzovaniya opisanij kazhdogo iz obektov vhodyashih v sostav agregacii DaPosrednik Mediator Obespechivaet vzaimodejstvie mnozhestva obektov formiruya pri etom slabuyu svyazannost i izbavlyaya obekty ot neobhodimosti yavno ssylatsya drug na druga DaHranitel Memento Pozvolyaet ne narushaya inkapsulyaciyu zafiksirovat i sohranit vnutrennie sostoyaniya obekta tak chtoby pozdnee vosstanovit ego v etih sostoyaniyah DaNull Object Null Object Predotvrashaet nulevye ukazateli predostavlyaya obekt po umolchaniyu NetNablyudatel ili Izdatel podpischik Observer Opredelyaet zavisimost tipa odin ko mnogim mezhdu obektami takim obrazom chto pri izmenenii sostoyaniya odnogo obekta vse zavisyashie ot nego opoveshayutsya ob etom sobytii Da angl Servant Ispolzuetsya dlya obespecheniya obshej funkcionalnosti gruppe klassov NetSpecifikaciya Specification Sluzhit dlya svyazyvaniya biznes logiki NetSostoyanie State Ispolzuetsya v teh sluchayah kogda vo vremya vypolneniya programmy obekt dolzhen menyat svoyo povedenie v zavisimosti ot svoego sostoyaniya DaStrategiya Strategy Prednaznachen dlya opredeleniya semejstva algoritmov inkapsulyacii kazhdogo iz nih i obespecheniya ih vzaimozamenyaemosti DaShablonnyj metod Template method Opredelyaet osnovu algoritma i pozvolyaet naslednikam pereopredelyat nekotorye shagi algoritma ne izmenyaya ego strukturu v celom DaPosetitel Visitor Opisyvaet operaciyu kotoraya vypolnyaetsya nad obektami drugih klassov Pri izmenenii klassa Visitor net neobhodimosti izmenyat obsluzhivaemye klassy DaSimple Policy NetEvent listener Net angl Single serving visitor Optimiziruet realizaciyu shablona posetitel kotoryj inicializiruetsya edinozhdy ispolzuetsya i zatem udalyaetsya Net angl Hierarchical visitor Predostavlyaet sposob obhoda vseh vershin ierarhicheskoj struktury dannyh napr drevovidnoj Net Chastnye Shablony parallelnogo programmirovaniya Ispolzuyutsya dlya bolee effektivnogo napisaniya mnogopotochnyh programm i predostavlyaet gotovye resheniya problem sinhronizacii Nazvanie Originalnoe nazvanie OpisanieAktivnyj obekt Active object Sluzhit dlya otdeleniya potoka vypolneniya metoda ot potoka v kotorom on byl vyzvan Ispolzuet shablony asinhronnyj vyzov metodov i planirovshik angl Balking Sluzhit dlya vypolneniya dejstviya nad obektom tolko togda kogda tot nahoditsya v korrektnom sostoyanii angl Binding properties Kombiniruet neskolko nablyudatelej dlya obespecheniya sinhronizacii svojstv v razlichnyh obektah angl Messaging pattern Messaging design pattern MDP Pozvolyaet komponentam i prilozheniyam obmenivatsya informaciej soobsheniyami Blokirovka s dvojnoj proverkoj Double checked locking Prednaznachen dlya umensheniya nakladnyh rashodov svyazannyh s polucheniem blokirovki angl Event Based Asynchronous Adresnye problemy s Asinhronnym patternom kotorye voznikayut v programmah s neskolkimi potokami angl Guarded suspension Ispolzuetsya dlya blokirovki vypolneniya dejstviya nad obektom tolko togda kogda tot nahoditsya v korrektnom sostoyanii Blokirovka Lock Odin potok blokiruet resurs dlya predotvrasheniya dostupa ili izmeneniya ego drugimi potokami Monitor Monitor Obekt prednaznachennyj dlya bezopasnogo ispolzovaniya bolee chem odnim potokom Reaktor Reactor Prednaznachen dlya sinhronnoj peredachi zaprosov servisu ot odnogo ili neskolkih istochnikov Blokirovka chteniya zapisi angl Read write lock Pozvolyaet neskolkim potokam odnovremenno schityvat informaciyu iz obshego hranilisha no pozvolyaya tolko odnomu potoku v tekushij moment vremeni eyo izmenyat Planirovshik Scheduler Obespechivaet mehanizm realizacii politiki planirovaniya no pri etom ne zavisyashih ni ot odnoj konkretnoj politiki angl Predostavlyaet pul potokov dlya obrabotki zadanij predstavlennyh obychno v vide ocheredi angl Sluzhit dlya predostavleniya razlichnyh globalnyh peremennyh dlya raznyh potokov Odnopotochnoe vypolnenie Single thread execution Prepyatstvuet konkurentnomu vyzovu metoda tem samym zapreshaya parallelnoe vypolnenie etogo metoda Cooperative pattern Obespechivaet mehanizm bezopasnoj ostanovki potokov ispolneniya ispolzuya obshij flag dlya signalizirovaniya prekrasheniya raboty potokov Shablony generacii obektov Singleton Factory Method Abstract Factory PrototypeShablony programmirovaniya gibkih obektov Composite Decorator FacadeShablony vypolneniya zadach Interpreter Strategy Observer Visitor CommandShablony arhitektury sistemy Osnovnaya statya Model View Controller MVC Model predstavlenie kontroller Model View Presenter Model View ViewModel angl Naked objects Hierarchical Model View Controller VIPER Enterprise Active Record sposob dostupa k dannym relyacionnyh baz dannyh v obektno orientirovannom programmirovanii DAO Data Access Object Obekt Dostupa k Dannym Service Locator Lokator Sluzhb Shablony proektirovaniya potokovoj obrabotki Shablony proektirovaniya raspredelyonnyh sistem Shablony Baz Dannyh Data Mapper Identity Map Unit of Work Lazy LoadProchie Drugie tipy shablonov Takzhe na segodnyashnij den sushestvuet ryad drugih shablonov opisyvayut predostavlenie dostupa k hranimoj informacii opisyvayut osnovnoj podhod dlya sostavleniya trebovanij dlya programmnogo obespecheniya requirement analysis do nachala samogo processa programmnoj razrabotki opisyvayut process obsheniya mezhdu otdelnymi uchastnikami sotrudnikami organizacii opisyvayut organizacionnuyu ierarhiyu predpriyatiya firmy Antipatterny Anti Design Patterns opisyvayut kak ne sleduet postupat pri razrabotke programm pokazyvaya harakternye oshibki v dizajne i v realizacii Sm takzheAntipattern Dizajn manifest Obobshyonnoe programmirovanie Shablony C Shablony J2EE CQRS Dependency Injection Kniga Design Patterns ot sozdatelej shablonov proektirovaniya GRASP UMLPrimechaniyaMakkonnell 2005 s 100 101 Makkonnell 2005 s 101 Design Patterns in Haskell neopr Data obrasheniya 5 dekabrya 2014 Arhivirovano 13 dekabrya 2014 goda Peter Norvig Design Patterns in Dynamic Languages slides neopr Data obrasheniya 5 dekabrya 2014 Arhivirovano 12 dekabrya 2014 goda Revenge of the Nerds neopr In the OO world you hear a good deal about patterns I wonder if these patterns are not sometimes evidence of case c the human compiler at work When I see patterns in my programs I consider it a sign of trouble The shape of a program should reflect only the problem it needs to solve Any other regularity in the code is a sign to me at least that I m using abstractions that aren t powerful enough often that I m generating by hand the expansions of some macro that I need to write Data obrasheniya 13 fevralya 2015 Arhivirovano 7 iyunya 2019 goda Abelson Sassman Struktura i interpretaciya kompyuternyh programm SICP citaty Mozhno stroit abstrakcii procedur i dannyh mozhno ispolzovat funkcii vysshih poryadkov chtoby ohvatit obshie shablony ih ispolzovaniya i mozhno s legkostyu realizovyvat vstroennye yazyki s 16 Odna iz teh veshej kotoryh my dolzhny trebovat ot moshnogo yazyka programmirovaniya eto vozmozhnost stroit abstrakcii putyom prisvoeniya imen obshim shemam a zatem pryamo rabotat s etimi abstrakciyami Chasto odna i ta zhe shema programmy ispolzuetsya s razlichnymi procedurami Dlya togo chtoby vyrazit eti shemy kak ponyatiya nam nuzhno stroit procedury kotorye prinimayut drugie procedury kak argumenty libo vozvrashayut ih kak znacheniya s 70 opredelenie shablonnyh shem v vide procedur sluzhit sredstvom abstrakcii s 263 glava 4 1 5 Dannye kak programmy s 357 360 ponyatie o sredstvah abstrakcii i ih roli dano na s 25 Binding Properties neopr Data obrasheniya 10 marta 2011 Arhivirovano 11 aprelya 2012 goda Christian Nagel Bill Evjen Jay Glynn Karli Watson and Morgan Skinner Event based Asynchronous Pattern Professional C 2008 neopr Wiley 2008 S 570 571 ISBN 9780470191378 Lock Pattern neopr Data obrasheniya 10 marta 2011 Arhivirovano 23 oktyabrya 2012 goda Interview and Book Excerpt Dan Haywood s Domain Driven Design Using Naked Objects neopr Data obrasheniya 10 iyulya 2015 Arhivirovano 3 marta 2021 goda LiteraturaZandstra M PHP Objects Patterns and Practice 5th Edition 2016 S 583 ISBN 978 1 4842 1995 9 Zandstra M PHP Obekty shablony i metodiki programmirovaniya 5 e izd SPb 2019 S 736 ISBN 978 5 907144 54 5 Fauler Martin Refaktoring koda na JavaScript uluchshenie proekta sushestvuyushego koda 2 e izd SPb 2019 S 464 ISBN 978 5 907144 59 0 Gamma E Helm R Dzhonson R Vlissides Dzh Priemy obektno orientirovannogo proektirovaniya Patterny proektirovaniya PHP Objects Patterns and Practice Third Edition 3 e izdanie M 2015 S 368 ISBN 978 5 496 00389 6 Dzhejson Mak Kolm Smit Elementarnye shablony proektirovaniya Elemental Design Patterns M 2012 304 s ISBN 978 5 8459 1818 5 Fauler Martin Bek Kent Brant Dzhon Opdajk Uilyam Roberts Don Refaktoring uluchshenie proekta sushestvuyushego koda M 2019 448 s ISBN 978 5 9909445 1 0 Martin Fauler Shablony korporativnyh prilozhenij Signature Series Patterns of Enterprise Application Architecture Addison Wesley Signature Series M 2012 544 s ISBN 978 5 8459 1611 2 Mark Grand Shablony proektirovaniya v JAVA Katalog populyarnyh shablonov proektirovaniya proillyustrirovannyh pri pomoshi UML Patterns in Java Volume 1 A Catalog of Reusable Design Patterns Illustrated with UML M 2004 S 560 ISBN 5 94735 047 5 Kreg Larman Primenenie UML 2 0 i shablonov proektirovaniya Applying UML and Patterns An Introduction to Object Oriented Analysis and Design and Iterative Development M 2006 S 736 ISBN 0 13 148906 2 Stiv Makkonnell Sovershennyj kod Code complete SPb Piter 2005 S 896 Master klass ISBN 5 7502 0064 7 5 469 00822 3 SsylkiOlga Dubina Obzor patternov proektirovaniya neopr Obzor neskolkih naibolee znachitelnyh monografij posvyashennyh patternam proektirovaniya informacionnyh sistem Data obrasheniya 5 sentyabrya 2006 Arhivirovano iz originala 27 avgusta 2006 goda Portland Pattern Repository spisok shablonov proektirovaniya na dvizhke viki Strukturnye shablony proektirovaniya v XML Eclipse s Culture of Shipping angl Erich GammaDlya uluchsheniya etoj stati zhelatelno Prostavit snoski vnesti bolee tochnye ukazaniya na istochniki Pozhalujsta posle ispravleniya problemy isklyuchite eyo iz spiska parametrov Posle ustraneniya vseh nedostatkov etot shablon mozhet byt udalyon lyubym uchastnikom
