При создании программных систем перед разработчиками часто встает проблема выбора тех или иных проектных решений. В этих случаях на помощь приходят паттерны. Дело в том, что почти наверняка подобные задачи уже решались ранее и уже существуют хорошо продуманные элегантные решения, составленные экспертами. Если эти решения описать и систематизировать в каталоги, то они станут доступными менее опытным разработчикам, которые после изучения смогут использовать их как шаблоны или образцы для решения задач подобного класса. Паттерны как раз описывают решения таких повторяющихся задач.
Концепция создания программного обеспечения с использованием паттернов, несомненно, очень важная, но относительно молодая, быть может, поэтому до сих пор нет четкого определения, что же такое паттерн. Об этом свидетельствуют непрекращающиеся дискуссии в популярной литературе и на соответствующих форумах в сети.
Например, следует ли считать алгоритмы и структуры данных паттернами? По этому вопросу существуют противоположные мнения. Согласно одному из них, алгоритмы являются вычислительными паттернами, а хорошо известная фундаментальная монография Дональда Кнута «Искусство программирования» по сути, представляет собой каталог таких паттернов. Согласно другому мнению, алгоритмы не являются паттернами, так как решаемые ими проблемы слишком малы (оперируют такими понятиями как вычислительная сложность и потребление ресурсов), а область решения хорошо очерчена. Паттерны же решают проблемы большего масштаба, при этом паттерн дает не конкретное решение, а некий путь к решению, причем, выбор правильного паттерна — задача нетривиальная, предполагающая от архитектора наличие интуиции, опыта, определенного творчества.
Зачем и кому надо изучать паттерны
Классификация паттернов
В силу популярности каталога GoF часто под паттернами проектирования подразумевают все виды паттернов программной индустрии, что является не совсем корректным. В области разработки программных систем существует множество паттернов, которые отличаются областью применения, масштабом, содержимым, стилем описания. Например, в зависимости от сферы применения существуют такие паттерны как паттерны анализа, проектирования, тестирования, документирования, организации процесса разработки, планирования проектов и другие. В настоящее время наиболее популярными паттернами являются паттерны проектирования. Одной из распространенных классификаций таких паттернов является классификация по степени детализации и уровню абстракции рассматриваемых систем.
Паттерны делятся на следующие категории:
- Архитектурные паттерны
- Паттерны проектирования
- Идиомы
Архитектурные паттерны, являясь наиболее высокоуровневыми паттернами, описывают структурную схему программной системы в целом. В данной схеме указываются отдельные функциональные составляющие системы, называемые подсистемами, а также взаимоотношения между ними. Примером архитектурного паттерна является хорошо известная программная парадигма «модель-представление-контроллер» (model-view-controller — MVC). В свою очередь, подсистемы могут состоять из архитектурных единиц уровнем ниже.
Паттерны для самых маленьких. Подготовка.
Паттерны проектирования описывают схемы детализации программных подсистем и отношений между ними, при этом они не влияют на структуру программной системы в целом и сохраняют независимость от реализации языка программирования. Паттерны GoF относятся именно к этой категории. Под паттернами проектирования объектно-ориентированных систем понимается описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте. В русскоязычной литературе обычно встречаются несколько вариантов перевода оригинального названия design patterns — паттерны проектирования, шаблоны проектирования, образцы. Здесь в основном используется первый вариант, иногда второй.
Идиомы, являясь низкоуровневыми паттернами, имеют дело с вопросами реализации какой-либо проблемы с учетом особенностей данного языка программирования. При этом часто одни и те же идиомы для разных языков программирования выглядят по-разному или не имеют смысла вовсе. Например, в C++ для устранения возможных утечек памяти могут использоваться интеллектуальные указатели.
Интеллектуальный указатель содержит указатель на участок динамически выделенной памяти, который будет автоматически освобожден при выходе из зоны видимости. В среде Java такой проблемы просто не существует, так как там используется автоматическая сборка мусора. Обычно, для использования идиом нужно глубоко знать особенности применяемого языка программирования. Следует отметить, что в программной области существуют и другие виды паттернов, не относящиеся к проектированию вообще, например, паттерны анализа, тестирования, документирования и др.
Типы паттернов проектирования
Порождающие паттерны
- Абстрактная фабрика (Abstract factory) — класс, который представляет собой интерфейс для создания компонентов системы.
- Фабричный метод (Factory method) — определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать.
- Прототип (Prototype) — определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор.
- Строитель (Builder) — класс, который представляет собой интерфейс для создания сложного объекта.
- Одиночка (Singleton) — класс, который может иметь только один экземпляр.
- Отложенная инициализация (Lazy initialization) — объект, инициализируемый во время первого обращения к нему.
Структурные паттерны
- Адаптер (Adapter) — объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.
- Компоновщик (Composite) — объект, который объединяет в себе объекты, подобные ему самому.
- Декоратор или Обёртка (Decorator) — класс, расширяющий функциональность другого класса без использования наследования.
- Фасад (Facade) — объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.
- Единая точка входа (Front Controller) — обеспечивает унифицированный интерфейс для интерфейсов в подсистеме. Front Controller определяет высокоуровневый интерфейс, упрощающий использование подсистемы.
- Заместитель (Proxy) — объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.
Поведенческие паттерны
- Команда, Экшен, Транзакция (Command) — представляет действие. Объект команды заключает в себе само действие и его параметры.
- Стратегия (Strategy) — предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости.
- Шаблонный метод (Template method) — определяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.
- Наблюдатель, Слушатель (Observer) — определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.
- Цепочка обязанностей (Chain of responsibility) — предназначен для организации в системе уровней ответственности.
Источник: blog-programmista.ru
Понятие «паттерн» (шаблон)

Единичное событие может означать все что угодно. Если оно произойдет во второй раз — это все еще может быть результатом случайного совпадения, но троекратное повторение — уже некий паттерн, закономерность.
- Один скандал — это просто событие, а все время повторяющиеся скандалы — уже паттерн.
- Если вы один раз не сумели сдать работу в срок, то это может быть просто невезением. Но когда задержки происходят постоянно — это паттерн.
Обращайте внимание на повторяющееся невезение, цепь совпадений или постоянное возникновение одной и той же проблемы, даже если всякий раз на это есть разные и вполне основательные причины.
На уровне отдельного события ваша способность повлиять на ситуацию может быть невелика. Но если вы разглядели паттерн, у вас есть возможность построить модель структуры системы и найти в ней точку приложения рычага, которая даст возможность изменить структуру, а благодаря этому и события
АРХЕТИП (arche — начало и typos — образ) — первообраз, оригинал. Архетипы предлагают основную структуру или основу, на которой может быть разработана и изготовлена модель. Архетипов достаточно мало. Их строение имеет общий характер
Архетипы систем, число которых сравнительно невелико, дают основание для вывода, к которому интуитивно приходят все опытные менеджеры.
2 Способа применения архетипов:
- (1) Диагностический
- Помогает изучить модели поведения, которые уже присутствуют в их организации. Эффективный инструмент для ответа на вопрос: «Почему возникают одни и те же проблемы?»
- Помогают определить, что можно сделать для улучшения состояния организации. Помогают подготовить сотрудников, к тем или иным изменениям
Критика
- Системная динамика сводит весь спектр возможных решений к небольшому набору стандартизированных архетипов, хотя сначала именно системная динамика выступала против упрощенного подхода операционных исследований, сводящих всю сложную реальность к простым математическим формулам.
- Однако системная динамика сегодня сводит все к слишком простым решениям.
ВЫВОД. Нельзя рассматривать АРХЕТИПЫ – как ПАНАЦЕЮ от всех болезней, это просто УДОБНЫЙ и ЭФФЕКТИВНЫЙ инструмент (но не всеобъемлющий)!
АРХЕТИП 1 – УРАВНОВЕШИВАНИЕ С ЗАДЕРЖКОЙ

- Человек, группа или организация, продвигаясь к цели, изменяют поведение в ответ на запаздывающие сигналы обратной связи.
- Если они их не учитывают, то
- (1) начинают использовать более сильные корректирующие действия, чем требуется,
- (2) либо (порой) вообще отказываются от корректировок
Ранние симптомы. “Мы думали, что достигли равновесия, но затем малость перегнули палку”. (Позднее возможен перегиб в обратном направлении.)
Принцип управления. При большой задержке энергичная политика порождает нестабильность. Нужно сохранять терпение либо сделать систему более чуткой к воздействиям.
Пример из деловой жизни. Строители продолжают вкладывать деньги в новые объекты, пока рынок не начинает “прогибаться”, но к этому времени в строительстве уже столько новых объектов, что затоваривание неизбежно.
- Другие примеры.
- Душ, в котором поступление горячей воды медленно реагирует на изменение положения вентиля;
- (Игра «BeerGame»!)циклы перепроизводства и дефицита в системе производства и сбыта (как в “пивной игре”);
- циклические изменения объемов производства и запасов готовой продукции при длительности цикла производства;
- убийство студентов на площади Тяньаньмынь, когда правительство КНР долго не замечало студенческие демонстрации, а потом отреагировало с неожиданной жестокостью;
- неожиданные и сильные взлеты и падения фондового рынка.
ПРАКТИЧЕСКОЕ ЗАДАНИЕ: привести 1…2 примера из реальной практики. Дать краткое описание, указать величину ЗАДЕРЖКИ и построить образец поведения во времени
АРХЕТИП 2 –ПРЕДЕЛЫ РОСТА (Limits to Growth / Success)

- Рост не может неограниченно продолжаться с усиливающейся динамикой
- Всегда существует предел (ограничение), который со временем даст знать о себе
Описание. Механизм обратной связи обеспечивает период ускоренного роста или экспансии. Затем рост начинает замедляться (обычно необъяснимо для участников) и, наконец, останавливается, а может даже перейти в ускоренный спад.
- Фаза роста определяется одним или несколькими усиливающими процессами обратной связи.
- Замедление возникает под действием процесса уравновешивающей обратной связи, которая включается по достижении определенной “границы”. Роль границы может сыграть недостаток ресурсов либо внутренняя или внешняя реакция на рост.
- Ускоренный спад есть результат изменения в направлении ускоряющего механизма обратной связи.

- (1) Приложение усилий даёт результат лишь на начальных стадиях
- (2) С достижением пределов «двигатель» роста начинает терять обороты
- (3) В конце темп роста меняет своё направление
Два типа ограничений:
Ранние симптомы. “Чего ради беспокоиться о несуществующих проблемах? У нас потрясающий рост”. (Чуть позднее: “Какие-то проблемы у нас есть, но что можно сделать? Только вернуться к тому, что работало раньше”. Еще позднее: “Чем сильнее мы нажимаем, тем прочнее стоим на месте”.)
Принцип управления. Не стоит давить на механизм, усиливающий рост. Нужно устранить (или ослабить) источники ограничения роста.
Источник: studfile.net
Паттерны проектирования
Данной статьей мы начинаем серию статей, посвященных паттернам проектирования.
Статьи рассчитаны на тех, кто уже хорошо знает ООП.
Что такое паттерны в программировании
Ну, что ж, давайте сначала разберемся что такое паттерн. А затем плавно перейдем к такому понятию как «паттерны в программировании».
Паттерн — это повторяющийся элемент в различных сферах жизни.
Пример 1: окрас тигра — это паттерн.

Пример 2: Коробка передач — это паттерн.

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

ВАЖНО:
Паттерн — это не готовое решение, которое можно откуда-то скопировать и вставить в Вашу программу. Это только общие принципы, которые надо уметь правильно применить.
Мне надо знать паттерны?
- Паттерны очень часто применяются на практике. Конечно, для начинающих программистов понимание паттернов не всегда заходит легко. Так что наберитесь терпения и учим, учим, учим.
- Паттерны часто спрашивают на собеседованиях.
- И самое главное — паттерны предлагают Вам готовые решения. Они помогут Вам сохранить время и усилия, а качество программы повысится.
Откуда они взялись
Хотя сама идея паттернов далеко не новая, популярной она стала после выхода книги «Приёмы объектно-ориентированного проектирования. Паттерны проектирования». Это произошло в 1994 году. С тех пор мир захватила «шаблономания»
Какие они бывают
Есть основные три категории паттернов:
- Порождающие (Creational Design Patterns)

Эти шаблоны что-то создают. Например, «как создать объект, который нельзя изменить»? «Как создать класс, который будет создавать новые объекты других классов?»?
- Структурные (Structural Design Patterns)

Отвечают за иерархию классов и интерфейсов. Например, «как заставить объекты с несовместимыми интерфейсами работа вместе»?
- Поведенческие (Behavioral Design Patterns)

Помогает добиться нужного поведения от объектов. Например, «как сделать так, чтобы объекты одного класса следили за изменениями в других классах и реагировали на них»?
Из чего состоит паттерн?
- Имя
- Задача, которую решает паттерн
- Решение:
- Структуры классов, составляющих решение;
- Примера на одном из языков программирования;
А конкретнее?
Существует 23 классических шаблона проектирования, с которых все и началось. В настоящий момент паттернов намного больше — минимум в 2-3 раза больше.
Здесь о каждом из них мы, конечно, говорить не будем — это много Но мы расскажем об основных паттернах в будущих статьях.
Самыми-самыми «базовыми» шаблонами проектирования можно назвать следующие:
С них можно начинать изучение паттернов. Ниже в этой статье Вы найдете ссылочки на статьи по этим паттернам.
Что следует знать
Одинаковые ли шаблоны для всех языков программирования?
Да, в целом понятия паттернов не привязано к конкретному языку. Тем не менее, когда говорят о паттернах, чаще всего имеют ввиду объектно-ориентированные языки программирования.
Паттернов очень много. Более того, кроме трех основных категорий, которые мы описали выше, есть и другие — шаблоны параллельного программирования, архитектурные шаблоны проектирования, и даже антипаттерны!
Да, конечно. Останется только всем о нем рассказать
Это все, что мы хотели Вам рассказать в данной статье.
Статьи, посвященные конкретным паттернам, Вы найдете по этим ссылочкам:
- Паттерн Singleton — Часть 1
- Паттерн Singleton — Часть 2
- Паттерн Builder
- Паттерн Factory — Часть 1
Надеемся, наша статья была Вам полезна. Также есть возможность записаться на наши курсы. Детальнее у на сайте.
- ← Правила наследования в Java
- Методы в Java →
Источник: vertex-academy.com
