Данный гист содержит описание существующих паттернов проектирования. Также возможны примеры на джаве.
-
-
Save vovs03/97a6adab247553206c8e35c5e0b1370c to your computer and use it in GitHub Desktop.
- Паттерн или шаблон проектирования - повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.
-
Abstract Factory (Абстрактная фабрика) - предоставляет интерфейс для создания групп связанных или зависимых объектов, не указывая их конкретный класс.
-
Factory Method (Фабричный метод) - определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанцировать. Позволяет делегировать создание объекта подклассам.
-
Builder (Строитель) - разделяет создание сложного объекта и инициализацию его состояния так, что одинаковый процесс построения может создать объекты с разным состоянием.
-
Prototype (Прототип) - определяет несколько видов объектов, чтобы при создании использовать объект-прототип и создает новые объекты, копируя прототип.
- Примером реализации в Java данного паттерна является метод
java.util.Object.clone()
.
- Примером реализации в Java данного паттерна является метод
-
Singleton (Одиночка) - гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к нему.
-
Adapter (Адаптер) - конвертирует интерфейс класса в другой интерфейс, ожидаемый клиентом. Позволяет классам с разными интерфейсами работать вместе.
-
Proxy (Прокси) - предоставляет замену другого объекта для контроля доступа к нему.
-
Bridge (Мост) - разделяет абстракцию и реализацию так, чтобы они могли изменяться независимо.
-
Composite (Компоновщик) - компонует объекты в дреновидную структуру, представляя их в виде иерархии. Позволяет клиенту одинакового обращаться как к отдельному объекту, так и к целому поддереву.
-
Decorator (Декоратор) - динамически предоставляет объекту дополнительные возможности. Представляет собой гибкую альтернативу наследованию для расширения функциональности.
-
Facade (Фасад) - предоставляет единый интерфейс к группе интерфейсов подсистемы. Определяет высокоуровневый интерфейс, делая подсистему проще для использования.
-
Flyweight (Приспособленец, Легковесная) - благодаря совместному использованию, поддерживает эффективную работу с большим количеством объектов. Его суть заключается в том, что тяжеловесный объект, представляющий себя как уникальный экземпляр в разных местах программы, по факту не является таковым.
- Примером является старая реализация
java.lang.String
, где тяжеловсным объектом является массив charов, а все условные копии данной строки ссылаются на него-же. Таким образом методы вродеjava.lang.String.substring()
работали быстро, так как достаточно было только передвинуть указатели и отображать кусок от всей строки. От такой реализации отказались, так как она могла привести к утечке памяти.
- Примером является старая реализация
-
Memento (Хранитель) - не нарушая инкапсуляцию, определяет и сохраняет внутреннее состояние объекта и позволяет позже восстановить объект в этом состоянии.
-
Chain of responsibility (Цепочка обязанностей) - избегает связывания отправителя запроса с его получателем, давая возможность обработать запрос более чем одному объекту. Связывает объекты-получатели и передает запрос по цепочке, пока объект не обработает его.
-
Observer (Наблюдатель) - определяет зависимость "один ко многим" между объектами так, что когда один объект меняет свое состояние, все зависимые объекты оповещаются и обновляются автоматически.
-
Command (Команда) - инкапсулирует запрос в виде объекта, позволяя передавать их клиентам в качестве параметров, ставить в очередь, логировать, а также поддерживает отмену операций.
-
State (Состояние) - позволяет объекту менять свое поведение в зависимости от внутреннего состояния.
-
Interpreter (Интерпретатор) - получая формальный язык, определяет представление его грамматики и интерпретатор, использующий это представление для обработки выражений языка.
-
Strategy (Стратегия) - определяет группу алгоритмов, инкапсулирует их и делает взаимозаменяемыми. Позволяет изменять алгоритм независимо от клиентов, его использующих.
-
Iterator (Итератор) - предоставляет способ последовательного доступа к элементам множества, независимо от его внутренного устройства.
-
Template method (Шаблонный метод) - определяет алгоритм, некоторые этапы которого делегируются подклассам. Позволяет подклассам переопределить эти этапы, не меняя структуру алгоритма.
-
Mediator (Посредник) - определяет объект, инкапсулирующий способ взаимодействия объектов. Обеспечивает слабую свзяь, избавляя объекты от необходимости прямо ссылаться друг на друга и дает возможность независимо изменять их взаимодействие.
-
Visitor (Посетитель) - представляет собой операцию, которая будет выполнена над объектами группы классов. Дает возможность определить новую операцию без изменения кода классов, над которыми эта операция проводится.
- Примером этого паттерна является работа javac компилятора.
- MVC (Model-View-Controller) - схема использования нескольких шаблонов проектирования, с помощью которых модель приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные.
- MVP (Model-View-Presenter) - шаблон проектирования, производный от MVC, который используется в основном для построения пользовательского интерфейса. Элемент Presenter в данном шаблоне берёт на себя функциональность посредника (аналогично контроллеру в MVC) и отвечает за управление событиями пользовательского интерфейса так же, как в других шаблонах обычно отвечает представление.
- MVVM (Model-View-ViewModel) - шаблон проектирования, производный от MVP, который используется для разделения модели и её представления, что необходимо для изменения их отдельно друг от друга. Например, разработчик задает логику работы с данными, а дизайнер соответственно работает с пользовательским интерфейсом.