Шаблон проектирования программного обеспечения

Многоразовый дизайн для написания кода, который обеспечивает четко определенную функцию

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

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

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

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

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

История

Паттерны возникли как архитектурная концепция Кристофера Александера еще в 1977 году в A Pattern Language (см. его статью "The Pattern of Streets", JOURNAL OF THE AIP, сентябрь 1966 г., том 32, № 5, стр. 273–278). В 1987 году Кент Бек и Уорд Каннингем начали экспериментировать с идеей применения паттернов к программированию — в частности, языков паттернов — и представили свои результаты на конференции OOPSLA в том же году. [1] [2] В последующие годы Бек, Каннингем и другие продолжили эту работу.

Шаблоны проектирования приобрели популярность в информатике после того, как в 1994 году так называемая «Банда четырех» (Гамма и др.) опубликовала книгу « Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения », которую часто сокращают до «GoF». В том же году прошла первая конференция Pattern Languages ​​of Programming , а в следующем году был создан Portland Pattern Repository для документирования шаблонов проектирования. Область применения термина остается предметом споров. Известные книги в жанре шаблонов проектирования включают:

Хотя шаблоны проектирования применяются на практике уже давно, формализация концепции шаблонов проектирования затянулась на несколько лет. [3]

Упражняться

Шаблоны проектирования могут ускорить процесс разработки, предоставляя проверенные парадигмы разработки. [4] Эффективное проектирование программного обеспечения требует рассмотрения проблем, которые могут не проявиться до поздней стадии реализации. Свеженаписанный код часто может иметь скрытые, тонкие проблемы, обнаружение которых занимает время; проблемы, которые иногда могут вызвать серьезные проблемы в будущем. Повторное использование шаблонов проектирования может помочь предотвратить такие проблемы, [5] и улучшить читаемость кода для тех, кто знаком с шаблонами.

Методы проектирования программного обеспечения трудно применять к более широкому кругу проблем. [ необходима ссылка ] Шаблоны проектирования предоставляют общие решения, задокументированные в формате, который не требует конкретики, привязанной к конкретной проблеме.

В 1996 году Кристофер Александр был приглашен выступить с программной речью на съезде OOPSLA 1996 года. Здесь он размышлял о том, как развивалась его работа над шаблонами в архитектуре, и о своих надеждах на то, как сообщество разработчиков программного обеспечения может помочь архитектуре расширить шаблоны для создания живых структур, использующих генеративные схемы, которые больше похожи на компьютерный код.

Мотив

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

Шаблоны, специфичные для домена

Также были предприняты усилия по кодификации шаблонов дизайна в определенных доменах, включая использование существующих шаблонов дизайна, а также шаблонов дизайна, специфичных для домена. Примерами являются шаблоны дизайна пользовательского интерфейса , [6] визуализация информации , [7] безопасный дизайн, [8] «безопасное удобство использования», [9] веб-дизайн [10] и дизайн бизнес-моделей. [11]

Ежегодные материалы конференции Pattern Languages ​​of Programming [12] включают множество примеров шаблонов, специфичных для предметной области.

Объектно-ориентированное программирование

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

Примеры

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

Творческие модели

ИмяОписаниеВ шаблонах проектированияВ коде завершено [13]Другой
Абстрактная фабрикаПредоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.ДаДа
СтроительОтделите построение сложного объекта от его представления, позволяя одному и тому же процессу построения создавать различные представления.ДаДа
Внедрение зависимостиКласс принимает требуемые ему объекты от инжектора вместо того, чтобы создавать объекты напрямую.Да
Заводской методОпределите интерфейс для создания одного объекта, но позвольте подклассам решать, какой класс инстанцировать. Фабричный метод позволяет классу отложить инстанцирование подклассам.ДаДа
Ленивая инициализацияТактика откладывания создания объекта, вычисления значения или какого-либо другого дорогостоящего процесса до первого раза, когда это понадобится. Этот шаблон появляется в каталоге GoF как "виртуальный прокси", стратегия реализации для шаблона Proxy .ДаДаPoEAA [14]
МноготонныйУбедитесь, что класс имеет только именованные экземпляры, и предоставьте глобальную точку доступа к ним.ДаДаДа
Объектный пулИзбегайте дорогостоящего приобретения и освобождения ресурсов путем переработки объектов, которые больше не используются. Можно считать обобщением шаблонов пула соединений и пула потоков .ДаДаДа
ПрототипУкажите типы объектов, которые необходимо создать, используя прототипный экземпляр, и создавайте новые объекты из «скелета» существующего объекта, тем самым повышая производительность и сводя к минимуму потребление памяти.ДаДаДа
Получение ресурсов — инициализация (RAII)Обеспечьте правильное высвобождение ресурсов, привязав их к сроку службы подходящих объектов.ДаДаДа
СинглтонУбедитесь, что класс имеет только один экземпляр, и предоставьте глобальную точку доступа к нему.ДаДаДа
ИмяОписаниеВ шаблонах проектированияВ коде завершено [13]Другой
Адаптер , оболочка или трансляторПреобразовать интерфейс класса в другой интерфейс, ожидаемый клиентами. Адаптер позволяет классам работать вместе, что в противном случае было бы невозможно из-за несовместимых интерфейсов. Эквивалент шаблона интеграции предприятия — транслятор.ДаДаДа
МостОтделите абстракцию от ее реализации, позволив им изменяться независимо.ДаДаДа
КомпозитныйСоставляйте объекты в древовидные структуры для представления иерархий часть-целое. Composite позволяет клиентам обрабатывать отдельные объекты и композиции объектов единообразно.ДаДаДа
ДекораторПрикрепите дополнительные обязанности к объекту, динамически сохраняя тот же интерфейс. Декораторы предоставляют гибкую альтернативу подклассификации для расширения функциональности.ДаДаДа
ДелегацияРасширить класс путем композиции вместо подклассификации. Объект обрабатывает запрос путем делегирования второму объекту (делегату)ДаДаДа
Объект расширенияДобавление функциональности в иерархию без изменения самой иерархии.ДаДаДа
ФасадПредоставляет унифицированный интерфейс для набора интерфейсов в подсистеме. Фасад определяет интерфейс более высокого уровня, который упрощает использование подсистемы.ДаДаДа
Наилегчайший весИспользуйте совместное использование для эффективной поддержки большого количества однотипных объектов.ДаДаДа
Передний контроллерШаблон относится к проектированию веб-приложений. Он обеспечивает централизованную точку входа для обработки запросов.ДаДа

Шаблоны J2EE [15] PoEAA [16]

МаркерПустой интерфейс для связывания метаданных с классом.ДаДаЭффективная Java [17]
МодульОбъедините несколько связанных элементов, таких как классы, синглтоны, методы, используемые глобально, в одну концептуальную сущность.ДаДаДа
ПроксиПредоставьте суррогат или заполнитель для другого объекта, чтобы контролировать доступ к нему.ДаДаДа
Близнец [18]Twin позволяет моделировать множественное наследование в языках программирования, которые не поддерживают эту функцию.ДаДаДа

Модели поведения

ИмяОписаниеВ шаблонах проектированияВ коде завершено [13]Другой
ДоскаМодель искусственного интеллекта для объединения разнородных источников данных (см. систему «доска» )ДаДаДа
Цепочка ответственностиИзбегайте связывания отправителя запроса с его получателем, давая возможность обработать запрос нескольким объектам. Объедините получающие объекты в цепочку и передавайте запрос по цепочке, пока объект его не обработает.ДаДаДа
КомандаИнкапсулировать запрос как объект, тем самым позволяя параметризацию клиентов с различными запросами, а также постановку в очередь или регистрацию запросов. Это также позволяет поддерживать отменяемые операции.ДаДаДа
Удобный интерфейсРазработайте API, чтобы он был связан в цепочку методов, чтобы он читался как DSL. Каждый вызов метода возвращает контекст, через который становятся доступными следующие логические вызовы методов.ДаДаДа
Устный переводчикДля заданного языка определите представление его грамматики, а также интерпретатор, который использует это представление для интерпретации предложений на этом языке.ДаДаДа
ИтераторПредоставьте способ последовательного доступа к элементам совокупного объекта , не раскрывая его базовое представление.ДаДаДа
ПосредникОпределите объект, который инкапсулирует способ взаимодействия набора объектов. Медиатор способствует слабой связанности , не давая объектам явно ссылаться друг на друга, и позволяет их взаимодействию изменяться независимо.ДаДаДа
ПамяткаНе нарушая инкапсуляции, захватить и экстернализировать внутреннее состояние объекта, позволяя впоследствии восстановить объект в этом состоянии.ДаДаДа
Нулевой объектИзбегайте нулевых ссылок, предоставляя объект по умолчанию.ДаДаДа
Наблюдатель или публикация/подпискаОпределите зависимость «один ко многим» между объектами, при которой изменение состояния одного объекта приводит к автоматическому уведомлению и обновлению всех его зависимых объектов.ДаДаДа
СлугаОпределить общую функциональность для группы классов. Шаблон слуги также часто называют реализацией вспомогательного класса или класса утилиты для заданного набора классов. Вспомогательные классы обычно не имеют объектов, поэтому у них есть все статические методы, которые действуют на различные виды объектов класса.ДаДаДа
СпецификацияРекомбинируемая бизнес-логика в булевском стиле.ДаДаДа
СостояниеРазрешить объекту изменять свое поведение при изменении его внутреннего состояния. Объект будет выглядеть так, будто меняет свой класс.ДаДаДа
СтратегияОпределите семейство алгоритмов, инкапсулируйте каждый из них и сделайте их взаимозаменяемыми. Стратегия позволяет алгоритму изменяться независимо от клиентов, которые его используют.ДаДаДа
Метод шаблонаОпределить скелет алгоритма в операции, отложив некоторые шаги в подклассы. Шаблонный метод позволяет подклассам переопределять некоторые шаги алгоритма, не меняя структуру алгоритма.ДаДаДа
ПосетительПредставляет операцию, которая должна быть выполнена над экземплярами набора классов. Посетитель позволяет определить новую операцию, не изменяя классы элементов, над которыми она работает.ДаДаДа

Модели параллелизма

ИмяОписаниеВ POSA2 [19]Другой
Активный объектРазделяет выполнение метода от вызова метода, которые находятся в собственном потоке управления. Цель состоит в том, чтобы ввести параллелизм, используя асинхронный вызов метода и планировщик для обработки запросов.Да
УклонятьсяВыполняйте действие над объектом только тогда, когда объект находится в определенном состоянии.Нет
Связующие свойстваОбъединение нескольких наблюдателей для принуждения свойств различных объектов синхронизироваться или координироваться каким-либо образом. [20]Нет
Вычислительное ядроОдно и то же вычисление много раз параллельно, отличающееся целочисленными параметрами, используемыми с неветвящейся математикой указателей в общих массивах, например, оптимизированное для GPU матричное умножение или сверточная нейронная сеть .Нет
Двойная проверка блокировкиУменьшите накладные расходы на получение блокировки, сначала проверив критерий блокировки («подсказку о блокировке») небезопасным способом; только в случае успешного выполнения будет продолжена фактическая логика блокировки.

Может быть небезопасным при реализации в некоторых языковых/аппаратных комбинациях. Поэтому иногда его можно считать анти-шаблоном .

Да
Асинхронный на основе событийРешает проблемы с асинхронным шаблоном, возникающие в многопоточных программах. [21]Нет
Охраняемая подвескаУправляет операциями, требующими как получения блокировки, так и выполнения предварительного условия перед выполнением операции.Нет
ПрисоединитьсяJoin-pattern предоставляет способ писать параллельные, параллельные и распределенные программы с помощью передачи сообщений. По сравнению с использованием потоков и блокировок, это высокоуровневая модель программирования.Нет
ЗамокОдин поток устанавливает «блокировку» на ресурс, не позволяя другим потокам получать к нему доступ или изменять его. [22]НетPoEAA [14]
Шаблон проектирования обмена сообщениями (MDP)Позволяет осуществлять обмен информацией (т. е. сообщениями) между компонентами и приложениями.Нет
Объект мониторингаОбъект, методы которого подлежат взаимному исключению , что предотвращает возможность ошибочной попытки его использования несколькими объектами одновременно.Да
РеакторОбъект реактора предоставляет асинхронный интерфейс для ресурсов, которые должны обрабатываться синхронно.Да
Блокировка чтения-записиПозволяет одновременный доступ на чтение к объекту, но требует исключительного доступа для операций записи. Для записи может использоваться базовый семафор, а механизм копирования при записи может использоваться или не использоваться.Нет
ПланировщикЯвно контролируйте, когда потоки могут выполнять однопоточный код.Нет
Шаблон обработчика услугДля каждого запроса сервер создает выделенный клиентский обработчик для обработки запроса. [23] Также называется потоком на сеанс . [24]Нет
Пул потоковДля выполнения ряда задач создается ряд потоков, которые обычно организуются в очередь. Обычно задач гораздо больше, чем потоков. Можно считать частным случаем шаблона пула объектов .Нет
Хранилище, специфичное для потокаСтатическая или «глобальная» память, локальная для потока.Да
Безопасный параллелизм с исключительным правом собственностиИзбегание необходимости в параллельных механизмах времени выполнения, поскольку можно доказать исключительное владение. Это примечательная возможность языка Rust, но проверка во время компиляции — не единственное средство, программист часто вручную проектирует такие шаблоны в коде — опуская использование механизма блокировки, поскольку программист оценивает, что данная переменная никогда не будет доступна одновременно.Нет
Атомарные операции ЦПx86 и другие архитектуры ЦП поддерживают ряд атомарных инструкций, которые гарантируют безопасность памяти для изменения и доступа к примитивным значениям (целым числам). Например, два потока могут оба безопасно увеличивать счетчик. Эти возможности также могут использоваться для реализации механизмов для других шаблонов параллелизма, как указано выше. Язык C# использует класс Interlocked для этих возможностей.Нет

Документация

Документация для шаблона проектирования описывает контекст, в котором используется шаблон, силы в контексте, которые шаблон стремится разрешить, и предлагаемое решение. [25] Не существует единого стандартного формата для документирования шаблонов проектирования. Скорее, различные авторы шаблонов использовали множество различных форматов. Однако, по словам Мартина Фаулера , некоторые формы шаблонов стали более известными, чем другие, и, следовательно, стали общими отправными точками для новых усилий по написанию шаблонов. [26] Одним из примеров широко используемого формата документации является тот, который использовали Эрих Гамма , Ричард Хелм , Ральф Джонсон и Джон Влиссидес в своей книге Design Patterns . Она содержит следующие разделы:

  • Название и классификация модели: Описательное и уникальное название, помогающее идентифицировать модель и ссылаться на нее.
  • Цель: Описание цели шаблона и причины его использования.
  • Также известно как: Другие названия узора.
  • Мотивация (Силы): Сценарий, состоящий из проблемы и контекста, в котором этот шаблон может быть использован.
  • Применимость: Ситуации, в которых этот шаблон применим; контекст для шаблона.
  • Структура: Графическое представление шаблона. Для этой цели могут использоваться диаграммы классов и диаграммы взаимодействия .
  • Участники: список классов и объектов, используемых в шаблоне, и их роли в дизайне.
  • Взаимодействие: описание того, как классы и объекты, используемые в шаблоне, взаимодействуют друг с другом.
  • Последствия: описание результатов, побочных эффектов и компромиссов, вызванных использованием шаблона.
  • Реализация: Описание реализации шаблона; часть решения шаблона.
  • Пример кода: Иллюстрация того, как шаблон можно использовать в языке программирования.
  • Известные применения: Примеры реального использования шаблона.
  • Связанные паттерны: Другие паттерны, имеющие некоторую связь с паттерном; обсуждение различий между паттерном и похожими паттернами.

Критика

Некоторые предполагают, что шаблоны проектирования могут быть признаком того, что в данном языке программирования отсутствуют функции ( например, Java или C++ ). Питер Норвиг демонстрирует, что 16 из 23 шаблонов в книге Design Patterns (которая в первую очередь сосредоточена на C++) упрощены или устранены (через прямую языковую поддержку) в Lisp или Dylan . [27] Связанные наблюдения были сделаны Ханнеманом и Кичалесом, которые реализовали несколько из 23 шаблонов проектирования с использованием аспектно-ориентированного языка программирования (AspectJ) и показали, что зависимости на уровне кода были удалены из реализаций 17 из 23 шаблонов проектирования и что аспектно-ориентированное программирование может упростить реализацию шаблонов проектирования. [28] См. также эссе Пола Грэма «Месть ботаников». [29]

Неправильное использование шаблонов может привести к неоправданному увеличению сложности. [30]

По определению, шаблон должен быть запрограммирован заново в каждом приложении, которое его использует. Поскольку некоторые авторы видят в этом шаг назад от повторного использования программного обеспечения , предоставляемого компонентами , исследователи работали над тем, чтобы превратить шаблоны в компоненты. Мейер и Арноут смогли обеспечить полную или частичную компонентизацию двух третей шаблонов, которые они пытались реализовать. [31]

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

Смотрите также

Ссылки

  1. ^ Смит, Рид (октябрь 1987 г.). Панель по методологии проектирования . Приложение к Трудам OOPSLA '87. doi :10.1145/62138.62151. Уорд предостерег от требования слишком большого программирования на, как он выразился, «высоком уровне мастеров». Он указал, что письменный «язык шаблонов» может значительно улучшить выбор и применение абстракций. Он предложил «радикальный сдвиг в бремени проектирования и реализации», основывая новую методологию на адаптации работы Кристофера Александра в языках шаблонов, и что ориентированные на программирование языки шаблонов, разработанные в Tektronix, значительно помогли их усилиям по разработке программного обеспечения.
  2. ^ Бек, Кент ; Каннингем, Уорд (сентябрь 1987 г.). Использование шаблонных языков для объектно-ориентированного программирования. Семинар OOPSLA '87 по спецификации и проектированию объектно-ориентированного программирования . Получено 26.05.2006 .
  3. ^ Барони, Алин Люсия; Геэнек, Янн-Гаэль; Альбин-Амио, Эрве (июнь 2003 г.). Формализация шаблонов проектирования (Отчет). Технический отчет EMN. Нант : Высшая национальная школа промышленной и горнодобывающей промышленности в Нанте. CiteSeerX 10.1.1.62.6466 . S2CID  624834 – через ResearchGate. 
  4. ^ Бишоп, Джудит. "Шаблоны проектирования C# 3.0: используйте мощь C# 3.0 для решения реальных проблем". Книги по C# из O'Reilly Media . Получено 15.05.2012 . Если вы хотите ускорить разработку приложений .NET, вы готовы к шаблонам проектирования C# — элегантным, общепринятым и проверенным способам решения распространенных проблем программирования.
  5. ^ Tiako, Pierre F. (31 марта 2009 г.). "Формальное моделирование и спецификация шаблонов проектирования с использованием RTPA". В Tiako, Pierre F (ред.). Программные приложения: концепции, методологии, инструменты и приложения: концепции, методологии, инструменты и приложения . стр. 636. doi :10.4018/978-1-60566-060-8. ISBN 9781605660615.
  6. ^ Лааксо, Сари А. (2003-09-16). «Коллекция шаблонов проектирования пользовательского интерфейса». Университет Хельсинки, кафедра компьютерных наук . Получено 2008-01-31 .
  7. ^ Хир, Дж.; Агравала, М. (2006). «Шаблоны проектирования программного обеспечения для визуализации информации». Труды IEEE по визуализации и компьютерной графике . 12 (5): 853–60. CiteSeerX 10.1.1.121.4534 . doi :10.1109/TVCG.2006.178. PMID  17080809. S2CID  11634997. 
  8. ^ Догерти, Чад; Сейр, Кирк; Сикорд, Роберт С.; Свобода, Дэвид; Тогаси, Казуя (2009). Шаблоны безопасного проектирования (PDF) . Институт программной инженерии.
  9. ^ Гарфинкель, Симсон Л. (2005). Принципы и шаблоны проектирования компьютерных систем, которые одновременно безопасны и удобны в использовании (диссертация на соискание ученой степени доктора философии).
  10. ^ "Yahoo! Design Pattern Library". Архивировано из оригинала 29-02-2008 . Получено 31-01-2008 .
  11. ^ «Как разработать бизнес-модель для бережливого стартапа?». 2010-01-06 . Получено 2010-01-06 .
  12. ^ Шаблонные языки программирования, Труды конференции (ежегодно, 1994—) [1]
  13. ^ abc Макконнелл, Стив (июнь 2004). «Проектирование в строительстве». Code Complete (2-е изд.). Microsoft Press . стр. 104. ISBN 978-0-7356-1967-8Таблица 5.1 Популярные шаблоны проектирования
  14. ^ ab Fowler, Martin (2002). Patterns of Enterprise Application Architecture. Addison-Wesley . ISBN 978-0-321-12742-6.
  15. ^ Alur, Deepak; Crupi, John; Malks, Dan (2003). Основные шаблоны J2EE: лучшие практики и стратегии проектирования. Prentice Hall . стр. 166. ISBN 978-0-13-142246-9.
  16. ^ Фаулер, Мартин (2002). Модели архитектуры корпоративных приложений. Addison-Wesley . стр. 344. ISBN 978-0-321-12742-6.
  17. ^ Блох, Джошуа (2008). "Пункт 37: Используйте интерфейсы маркеров для определения типов". Effective Java (Второе изд.). Addison-Wesley. стр. 179. ISBN 978-0-321-35668-0.
  18. ^ «Близнецы — шаблон проектирования для моделирования множественного наследования» (PDF) .
  19. ^ Шмидт, Дуглас К.; Стал, Майкл; Ронерт, Ганс; Бушманн, Франк (2000). Архитектура программного обеспечения, ориентированная на шаблоны, том 2: Шаблоны для параллельных и сетевых объектов . John Wiley & Sons. ISBN 978-0-471-60695-6.
  20. ^ Свойства привязки
  21. ^ Нагель, Кристиан; Эвьен, Билл; Глинн, Джей; Уотсон, Карли; Скиннер, Морган (2008). «Асинхронный шаблон на основе событий». Professional C# 2008. Wiley. С. 570–571. ISBN 978-0-470-19137-8.
  22. ^ Шаблон замка
  23. ^ Франкаланца, Адриан; Табоне, Джерард (октябрь 2023 г.). «ElixirST: система типов на основе сеансов для модулей Elixir». Журнал логических и алгебраических методов в программировании . 135. doi :10.1016/j.jlamp.2023.100891. S2CID  251442539.
  24. ^ Шмидт, Дуглас К.; Виноски, Стив (июль–август 1996 г.). «Взаимосвязи объектов: сравнение альтернативных методов программирования для многопоточных серверов CORBA (столбец 7)» (PDF) . Отчет SIGS C++ . S2CID  2654843.
  25. ^ Габриэль, Дик . "Определение шаблона". Архивировано из оригинала 2007-02-09 . Получено 2007-03-06 .
  26. ^ Фаулер, Мартин (2006-08-01). "Написание шаблонов программного обеспечения" . Получено 2007-03-06 .
  27. ^ Норвиг, Питер (1998). Шаблоны проектирования в динамических языках.
  28. ^ Ханнеманн, Ян; Кицалес, Грегор (2002). "Реализация шаблона проектирования в Java и AspectJ". Труды 17-й конференции ACM SIGPLAN по объектно-ориентированному программированию, системам, языкам и приложениям - OOPSLA '02 . OOPSLA '02. стр. 161. doi :10.1145/582419.582436. ISBN 1581134711.
  29. ^ Грэм, Пол (2002). "Месть ботаников" . Получено 11 августа 2012 г.
  30. ^ Макконнелл, Стив (2004). Code Complete: A Practical Handbook of Software Construction, 2nd Edition . Pearson Education. стр. 105. ISBN 9780735619678.
  31. ^ Мейер, Бертран ; Арноут, Карин (июль 2006 г.). «Компонентизация: пример посетителя» (PDF) . IEEE Computer . 39 (7): 23–30. CiteSeerX 10.1.1.62.6082 . doi :10.1109/MC.2006.227. S2CID  15328522. 

Дальнейшее чтение

Взято с "https://en.wikipedia.org/w/index.php?title=Software_design_pattern&oldid=1244994495"