1. Абстрактная фабрика - Предоставляет интерфейс для создания
Порождающие шаблоны семейств взаимосвязанных или взаимозависимых объектов, не
проектирования специфицируя их конкретных классов
скрыть способ создания объекта
Factory Method/Фабричный метод - Определяет интерфейс для a. скрыть действительный класс создания объекта
создания объекта, но оставляет подклассам решение о том, какой b. создать множество совместно используемых объектов.
класс инстанциировать. Фабричный метод позволяет классу c. Получить возможность использования различных
делегировать создание подклассам. Используется, когда: версий реализации классов.
a. классу заранее неизвестно, объекты каких подклассов
ему нужно создавать.
b. класс спроектирован так, чтобы объекты, которые он
создаёт, специфицировались подклассами.
c. класс делегирует свои обязанности одному из
нескольких вспомогательных подклассов, и
планируется локализовать знание о том, какой класс
принимает эти обязанности на себя.
2. Builder - отделяет конструирование сложного объекта от его
Singleton - Гарантирует, что у класса есть только один экземпляр, и представления, так что в результате одного и того же процесса
предоставляет к нему глобальную точку доступа конструирования могут получаться разные представления.
a. контролируемый доступ к единственному экземпляру; a. позволяет изменять внутреннее представление продукта;
b. уменьшение числа имён; b. изолирует код, реализующий конструирование и
c. допускает уточнение операций и представления; представление;
d. допускает переменное число экземпляров; c. дает более тонкий контроль над процессом конструирования.
e. большая гибкость, чем у операций класса.
public class MySingleton { Применение
private static final MySingleton ourInstance = new MySingleton(); алгоритм создания сложного объекта не должен зависеть от того, из
каких частей состоит объект и как они стыкуются между собой;
private MySingleton () { процесс конструирования должен обеспечивать различные
} представления конструируемого объекта.
public synchronized static final MySingleton getInstance() {
return ourInstance;
}
}
3. Структурные шаблоны Proxy
Задача Контроль над доступом к объекту.
Adapter - это объект который изменяет интерфейс другого объекта. Решение: создать объект, который прозрачно управляет доступом к
(структурный шаблон проектирования, предназначенный для другому объекту.
организации использования функций объекта, недоступного для Последствия; Возникает новый посредник при доступе к объекту.
модификации, через специально созданный интерфейс.)
a. инкапсуляция реализации внешних классов (компонентов,
библиотек), система становится независимой от интерфейса
внешних классов;
b. переход на использование других внешних классов не
требует переделки самой системы, достаточно реализовать
один класс Adapter
4. ConcreteObservable - конкретный класс, который реализует
Шаблоны поведения (Behavioral patterns) интерфейс Observable.
Iterator ConcreteObserver - конкретный класс, который реализует интерфейс
Задача. Перебор элементов коллекции вне зависимости от его Observer.
реализации. Область применения
Решение. Создать объект, который занимается деталями перебора, -
последние прячутся от пользователя
Последствия: Развязка обхода, упрощение интерфейса коллекции,
инкапсуляция логики перебора.
First()
Next()
isDone()
currentItem()
Visitor
Задача разделение алгоритма от структуры объекта.
Идея в том что бы использовать структуру классов, каждый из
которых имел бы метод accept() который принимает объект visitor в
качестве аргумента.. Visitor это интерфейс который имеет метод
visit() для каждого элемента класса. accept() метод каждого
элемента, выполняет обратный вызов visit() своего класса.
Observer Шаблон «наблюдатель» применяется в тех случаях, когда система
Определяет зависимость типа «один ко многим» между объектами обладает следующими свойствами:
таким образом, что при изменении состояния одного объекта все существует, как минимум, один объект, рассылающий сообщения
зависящие от него оповещаются об этом событии. имеется не менее одного получателя сообщений, причём их
Observable - интерфейс, определяющий методы для добавления, количество и состав могут изменяться во время работы
удаления и оповещения наблюдателей. приложения. Данный шаблон часто применяют в ситуациях, в
Observer - интерфейс, с помощью которого наблюдаемый объект которых отправителя сообщений не интересует, что делают с
оповещает наблюдателей. предоставленной им информацией получатели.
5. Resign Patterns 2. Бесструктурные паттерны
Скакунов Александр Ниже представлен список из семи бесструктурных паттернов.
Опубликовано 14.02.2007 в Статьи, Юмор, Разработка
Проломы проектно-дизориентированного проектирования 2.1. Усыновитель (Adopter)
Усыновитель даёт кров функциям-беспризорникам. В результате получается семейство
Вступление функций, не похожих одна на другую и связанных между собой только через Усыновителя.
Любой, кто знаком с книгой о паттернах, написанной той самой Бандой Четырёх, знает, что
паттерны, указанные там, представляют собой изящные решения, выработанные годами. К 2.2. Бригада (Brig)
сожалению, извлечь паттерны из имеющегося кода не представляется возможным, потому что Бригада - контейнерный класс для кривого ПО. Также известно под названием модуль.
авторы этого кода не знали, что они должны были использовать паттерны. Сей труд - собрание
паттернов для народа. Паттерны, указанные здесь, представляют собой решения, 2.3. Компромисс (Compromise)
выдержавшие испытание временем. Желаю вам приятного чтения, но пожалуйста, не Паттерн Компромисс используется для создания баланса между сроками разработки и
вздумайте ими пользоваться! качеством продукта. В результате получается посредственное приложение - и всё равно с
опозданием.
1. Умерщвляющие паттерны
Ниже представлен список из пяти умерщвляющих паттерна. 2.4. Детонатор (Detonator)
Детонатор очень распространён, но часто остаётся незамеченным. Простой пример -
1.1. Крайняя Нищета (Abject Poverty) вычисления по последним двум цифрам года. Детонатор где-то рядом, и только и ждёт, чтобы
Паттерн Крайняя Нищета широко встречается в программах, которые настолько трудно взорваться!
тестировать и поддерживать, что это выливается в постоянные превышения бюджета.
2.5. Сыр (Fromage)
1.2. Ослепитель (Blinder) Паттерн Сыр - полон дыр. Этот паттерн состоит из мелких убогих фокусов, которые в итоге
Этот паттерн - подходящее решение для проблемы без учёта возможных изменений исходных сводят на нет переносимость приложения. Чем старше Сыр, тем лучше “пахнет”.
требований. До конца неясным остаётся, назван ли этот паттерн так потому, что инженер
надевает шоры во время фазы кодирования, либо потому, что можно сломать глаза во время 2.6. Мухоловка (Flypaper)
эксплуатации такого ПО. Паттерн Мухоловка написан одним инженером и поддерживается другим. Инженер,
поддерживающий Мухоловку, вскоре обнаруживает, что вляпался, и он скорее погибнет, чем
1.3. Обманчивый Метод (Fallacy Method) выпутается.
Паттерн Обманчивый Метод характеризует обработку исключительных ситуаций. Логика
выглядит стройной, но если кто-либо побеспокоиться протестировать приложение либо 2.7. Эпоксидка (ePoxy)
наступит исключительная ситуация, вся обманчивость этой логики вылезает наружу. Эпоксидка встречается в сильно связанных между собой модулях. Чем больше связь между
ними, тем более заметным становится слой Эпоксидки промеж них.
1.4. Пробатип (ProtoTry)
Паттерн Пробатип - попытка разработать работающую модель приложения на скорую руку. 3. Паттерны плохого поведения
Естественное желание - переписать Пробатип, учитывая полученные из него уроки, однако Ниже представлен список из одиннадцати паттернов плохого поведения.
сроки поджимают. Пробатип также известен как имеющийся код (legacy code).
3.1. Цепочка Возможностей (Chain of Possibilities)
1.5. Симплтон (Simpleton) Цепочка Возможностей встречается в больших, плохо документированных модулях. Никто не
Симплтон - это жутко навороченный паттерн, используемый для решения самых примитивных знает вообще всей функциональности такого модуля, однако его возможности кажутся
задач. Он является точным показателем профессионального уровня тех, кто его использует. бескрайними. Также известен как Недетерминированный.
6. 3.2. Коммандос (Commando)
Коммандос используется, чтобы быстро ворваться в работу и также быстро её сделать. 3.11. Гость Из Преисподней (Visitor From Hell)
Коммандос может нарушить инкапсуляцию для успешного выполнения своей миссии. Девиз - Паттерн Гость Из Преисподней сродни отсутствию проверки на выход за границы массива во
пленных не брать. время выполнения. По крайней мере один контрольный цикл для системы неизбежно вызовет
Гостя Из Преисподней, который обязательно затрёт жизненно важные данные.
3.3. Распылитель (Intersperser)
Распылитель рассеивает частички функциональности по всей системе, препятствуя
тестированию, поддержке или пониманию любой из функций. Шаблоны это.
1. Проекты многократного использования.
3.4. Подстрекатель (Instigator)
Подстрекатель на первый взгляд белый и пушистый, но на самом деле сеет разрушение и хаос
2. Абстрактные решения общих проблем проектирования.
в других частях системы. 3. Решения часто возникающих задач.
4. Решение задач одного типа.
3.5. Импульс (Momentum) Шаблоны не являются:
Импульс растёт экспоненциально, увеличивая требования к памяти и месту на диске, а также 1. Решением конкретной задачи.
сложность приложения и его время выполнения.
2. Волшебны средством решения всех задач
3.6. Лекарь (Medicator) 3. Конкретными классами, библиотеками, готовыми решениями.
Лекарь - настоящия пожиратель времени, при этом остальные части системы приходиться
буквально откачивать и давать успокоительное. Плюс упомянуть об антипатернах
1.Шаблоны создания(Creational patterns)
3.7. Не-Виноватая-Я (Absolver)
Паттерн Не-Виноватая-Я встречается в коде, написанном бывшими сотрудниками компании.
1.Abstract Factory
Так много старых проблем заключено в таком коде, что теперешние сотрудники могут 2.Singleton
защитить свои наработки от обвинений, утверждая, что именно чужой код - причина всех 4.Builder
возникающих ошибок. Также известен под именем Это-Не-Моя-Правка. 2.Структурные шаблоны (Structural patterns)
1.Adapter
3.8. Вклад (Stake)
2.Proxy
Паттерн Вклад имеет место в приложениях, созданных инженерами, которые впоследствии
получили продвижение по службе. Несмотря на изобилие ошибок в программе, вклад этого 3.Шаблоны поведения (Behavioral patterns)
инженера слишком велик, чтобы позволить кому-либо начать переписывать этот код, т.к. он 1.Iterator
является апофеозом технических достижений этого товарища. 2.Visitor
3.Observer
3.9. Хвалебная Речь (Eulogy)
Паттерн Хвалебная Речь применяется во всех проектах, которые уже используют остальные 22
паттерна. Также известен как Посмертная Речь. Плюс упомянуть об антипатернах
3.10. Авральный Метод (Tempest Method) 1.God object
Авральный Метод применяется в последние несколько дней перед сдачей проекта. Данный 2.Magic numbers
паттерн характеризуется недостатком комментариев и многократным использованием
паттерна Детонатор.