Паттерны проектирования
Данной статьей мы начинаем серию статей, посвященных паттернам проектирования.
Статьи рассчитаны на тех, кто уже хорошо знает ООП.
Что такое паттерны в программировании
Ну, что ж, давайте сначала разберемся что такое паттерн. А затем плавно перейдем к такому понятию как «паттерны в программировании».
Паттерн — это повторяющийся элемент в различных сферах жизни.
Пример 1: окрас тигра — это паттерн.
Пример 2: Коробка передач — это паттерн.

В программировании, хотя каждая задача и каждая программа уникальна, у многих из них все же есть общие черты. Разработчики заметили эти закономерности, и выделили те, что наиболее часто встречаются, в паттерны (шаблоны проектирования, шаблоны программирования). В паттернах предлагается в том числе наиболее оптимальные способы реализации той или иной задачи.
Теперь, вместо того чтобы выдумывать велосипед заново, можно воспользоваться знаниями людей, которые уже решали эти проблемы до нас. Таким образом:
Шаблон проектирования / шаблон программирования / паттерн — это типичные способы решения часто возникающих задач в сфере разработки ПО.
ВАЖНО:
Паттерн — это не готовое решение, которое можно откуда-то скопировать и вставить в Вашу программу. Это только общие принципы, которые надо уметь правильно применить.
Мне надо знать паттерны?
- Паттерны очень часто применяются на практике. Конечно, для начинающих программистов понимание паттернов не всегда заходит легко. Так что наберитесь терпения и учим, учим, учим.
- Паттерны часто спрашивают на собеседованиях.
- И самое главное — паттерны предлагают Вам готовые решения. Они помогут Вам сохранить время и усилия, а качество программы повысится.
Откуда они взялись
Хотя сама идея паттернов далеко не новая, популярной она стала после выхода книги «Приёмы объектно-ориентированного проектирования. Паттерны проектирования«. Это произошло в 1994 году. С тех пор мир захватила «шаблономания»
Какие они бывают
Есть основные три категории паттернов:
- Порождающие (Creational Design Patterns)
Эти шаблоны что-то создают. Например, «как создать объект, который нельзя изменить»? «Как создать класс, который будет создавать новые объекты других классов?»?
- Структурные (Structural Design Patterns)
Отвечают за иерархию классов и интерфейсов. Например, «как заставить объекты с несовместимыми интерфейсами работа вместе»?
- Поведенческие (Behavioral Design Patterns)
Помогает добиться нужного поведения от объектов. Например, «как сделать так, чтобы объекты одного класса следили за изменениями в других классах и реагировали на них»?
Из чего состоит паттерн?
- Имя
- Задача, которую решает паттерн
- Решение:
- Структуры классов, составляющих решение;
- Примера на одном из языков программирования;
А конкретнее?
Существует 23 классических шаблона проектирования, с которых все и началось. В настоящий момент паттернов намного больше — минимум в 2-3 раза больше.
Здесь о каждом из них мы, конечно, говорить не будем — это много Но мы расскажем об основных паттернах в будущих статьях.
Самыми-самыми «базовыми» шаблонами проектирования можно назвать следующие:
- Singleton («Одиночка»)
- Builder («Строитель»)
- Factory («Фабрика»)
- Wrapper («Обертка»)
- Proxy («Прокси»)
С них можно начинать изучение паттернов. Ниже в этой статье Вы найдете ссылочки на статьи по этим паттернам.
Что следует знать
Одинаковые ли шаблоны для всех языков программирования?
Да, в целом понятия паттернов не привязано к конкретному языку. Тем не менее, когда говорят о паттернах, чаще всего имеют ввиду объектно-ориентированные языки программирования.
- 23 паттерна и все? Больше нет?
Паттернов очень много. Более того, кроме трех основных категорий, которые мы описали выше, есть и другие — шаблоны параллельного программирования, архитектурные шаблоны проектирования, и даже антипаттерны!
- А я могу создать паттерн?
Да, конечно. Останется только всем о нем рассказать
Это все, что мы хотели Вам рассказать в данной статье.
Статьи, посвященные конкретным паттернам, Вы найдете по этим ссылочкам:
Надеемся, наша статья была Вам полезна. Также есть возможность записаться на наши курсы. Детальнее у на сайте.
Java Design Patterns
Design Patterns are very popular among software developers. A design pattern is a well-described solution to common software problem.
Some of benefits of using design patterns are :
- Design patterns are already defined and provides industry standard approach to solve recurring problem, so it saves time if we use the design pattern .
- Using design pattern promotes re-usability that leads to more robust and highly maintainable code.
- Since design patterns are already defined, it makes out code easy to understand and debug. It lead to faster development and new members of team understand it easily.
What is a Design Pattern ?
A software design pattern is a general reusable solution to a commonly occurring problem within a given context in software design — Wikipedia
Java Design Patterns are divided into tree parts : Creational, Structural and Behavioral.
CREATIONAL DESIGN PATTERNS
Creational design pattens provide solution to instantiate an object in the best possible way for specific situations. The basic form of object creation could result in design problems or add unwanted complexity to the design. Creational design patterns solve this problem by controlling the object creation by different ways. There are five creational design patterns that we will discuss on :
- Singleton Pattern
- Factory Pattern
- Abstract Factory Pattern
- Builder Pattern
- Prototype Pattern
Pattern Singleton
Pattern Singleton: > One Class, one Instance.
Singleton is one of the Gangs of Four Design patterns and comes in the Creational Design Pattern category. Singleton pattern restricts the instantiation of a class and ensures that only one instance of the class exists in the Java virtual machine. The singleton class must provide a global access point to get the instance of the class. Singleton pattern is used for logging, driver objects, caching and thread pool. Singleton design pattern is also used in other design patterns like Abstract Factory, Builder, Prototype, Facade etc. Singleton design pattern is used in core Java classes also, for example java.lang.Runtime , java.awt.Desktop.
To implement Singleton pattern, there are really many approaches but all of them have following common concepts:
- A private constructor to avoid instantiation of the class,
- A private static variable from the same class that’s the only instance of the class.
- public static method that returns the instance of the class, this is the global access point for the outer world to get the instance of the class.
We’ll implement the thread safe one here. Classes are in the package com.singleton ;
Pattern Factory
Factory design pattern is used when we have a super class with multiple sub-classes and based on input, we need to return one of the sub-class. This pattern take out the responsibility of instantiation of a class from client program to the factory class. Let’s first learn how to implement factory pattern in Java and then we will learn its benefits and we will see its usage in JDK.
- Super Class : Super class in factory pattern can be an interface, abstract class or a normal Java class. For our example, we have super class as abstract class with overridden toString() method for testing purpose. see com.factory .
- sub-classes: Let’s say we have two sub-classes PC and Server with implementation in com.factory
Here’s what we have in image :
Now let’s write the test class.
This pattern provides some advantages such as :
- It provides approach to code for the interface rather than the implementation.
- It removes the instantiation of the actual implementation classes from client code, making it more robust.
- It provides abstraction between implementation and client classes through inheritance.
As examples of its implementation in JDK we have :
- java.util.Calendar, ResourceBundle() and NumberFormat getInstance();
- valueOf() method in wrapper classes like Boolean , Integer etc.
Abstract Factory
This is one of the Creational Pattern and almost similar to Factory Pattern except the fact that it’s most like Factory of factories. If you’re familiar with factory design pattern in java , you’ll notice that we have a single Factory class that returns the different sub-classes based on the input provided and the factory class uses if-else or switch statement to achieve this. Like our factory pattern post, we will use the same super class and sub-classes. Codes are available in com.abstractFactory . Here’s the implementation of the test class:
Pattern Builder
Builder pattern is a creational design pattern as Factory Pattern and Abstract Factory Pattern. This pattern was introduced to solve some of the problems with Factory and Abstract Factory patterns when the Object contains a lot of attributes. This pattern deals with a static nested class and then copy all the arguments from the outer class to the Builder class. The sample code where we have a Computer class and ComputerBuilder to build it are available in the package com.builder.Computer . Here’s a test program showing how to use Builder class to get object.
There are really various implementations of this pattern in JDK : java.lang.StringBuilder#append() (unsynchronized) java.lang.StringBuffer#append() (synchronized) .
Pattern Prototype
Prototype pattern is one of the Creational Design pattern, so it provides a mechanism of object creation. Prototype pattern is used when the Object creation is a costly affair and requires a lot of time and resources and you have a similar object already existing. So this pattern provides a mechanism to copy the original object to a new object and then modify it according to our needs. This pattern uses Java cloning to copy the object.
Here’s the program that will show the benefit of the Prototype pattern usage.
STRUCTURAL DESIGN PATTERNS
Structural Patterns provide different ways to create a class structure, for example using inheritance and composition to create a large object from small objects.
Adapter Pattern
This pattern is used in such a way that two unrelated interfaces can work together. The object that joins these unrelated interfaces is called Adapter. As a real life example, we can think of a mobile charger as an adapter because mobile battery needs 3 Volts to charge but the normal socket produces either 120V (US) or 240V (India). So the mobile charger works as an adapter between mobile charging socket and the wall socket. First of all we’ll have two classes : Volt — to measure volts) and Socket :
Now we want to build an adapter that can produce 3 volts, 12 volts and default 120 volts. So first of all we will create an adapter interface with these methods.
while implementing this pattern, there are two approaches : one that deals with inheritance and another one that deals with Composition. Note that they are almost the same thus, here we’ll deal with one with inheritance. Let’s implement out adapter class !
Now let’s see how all this work ! Here’s a test Main function to illustrate.
Name already in use
java-interview / patterns.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
2 contributors
Users who have contributed to this file
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Что такое «шаблон проектирования»?
Шаблон (паттерн) проектирования (design pattern) — это проверенное и готовое к использованию решение. Это не класс и не библиотека, которую можно подключить к проекту, это нечто большее — он не зависит от языка программирования, не является законченным образцом, который может быть прямо преобразован в код и может быть реализован по-разному в разных языках программирования.
Плюсы использования шаблонов:
- снижение сложности разработки за счёт готовых абстракций для решения целого класса проблем.
- облегчение коммуникации между разработчиками, позволяя ссылаться на известные шаблоны.
- унификация деталей решений: модулей и элементов проекта.
- возможность отыскав удачное решение, пользоваться им снова и снова.
- помощь в выборе выбрать наиболее подходящего варианта проектирования.
- слепое следование некоторому выбранному шаблону может привести к усложнению программы.
- желание попробовать некоторый шаблон в деле без особых на то оснований.
Назовите основные характеристики шаблонов.
- Имя — все шаблоны имеют уникальное имя, служащее для их идентификации;
- Назначение назначение данного шаблона;
- Задача — задача, которую шаблон позволяет решить;
- Способ решения — способ, предлагаемый в шаблоне для решения задачи в том контексте, где этот шаблон был найден;
- Участники — сущности, принимающие участие в решении задачи;
- Следствия — последствия от использования шаблона как результат действий, выполняемых в шаблоне;
- Реализация — возможный вариант реализации шаблона.
Типы шаблонов проектирования.
- Основные (Fundamental) — основные строительные блоки других шаблонов. Большинство других шаблонов использует эти шаблоны в той или иной форме.
- Порождающие шаблоны (Creational) — шаблоны проектирования, которые абстрагируют процесс создание экземпляра. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять созданный объект, а шаблон, порождающий объекты, делегирует создание объектов другому объекту.
- Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу.
- Поведенческие шаблоны (Behavioral) определяют взаимодействие между объектами, увеличивая таким образом его гибкость.
Приведите примеры основных шаблонов проектирования.
- Делегирование (Delegation pattern) — Сущность внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту.
- Функциональный дизайн (Functional design) — Гарантирует, что каждая сущность имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие.
- Неизменяемый интерфейс (Immutable interface) — Создание неизменяемого объекта.
- Интерфейс (Interface) — Общий метод структурирования сущностей, облегчающий их понимание.
- Интерфейс-маркер (Marker interface) — В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого применяются атрибуты или аннотации.
- Контейнер свойств (Property container) — Позволяет добавлять дополнительные свойства сущности в контейнер внутри себя, вместо расширения новыми свойствами.
- Канал событий (Event channel) — Создаёт централизованный канал для событий. Использует сущность-представитель для подписки и сущность-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одной сущности, даже если он зарегистрирован только на одном канале.
Приведите примеры порождающих шаблонов проектирования.
- Абстрактная фабрика (Abstract factory) — Класс, который представляет собой интерфейс для создания других классов.
- Строитель (Builder) — Класс, который представляет собой интерфейс для создания сложного объекта.
- Фабричный метод (Factory method) — Делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.
- Прототип (Prototype) — Определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор.
- Одиночка (Singleton) — Класс, который может иметь только один экземпляр.
Приведите примеры структурных шаблонов проектирования.
- Адаптер (Adapter) — Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.
- Мост (Bridge) — Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо.
- Компоновщик (Composite) — Объект, который объединяет в себе объекты, подобные ему самому.
- Декоратор (Decorator) — Класс, расширяющий функциональность другого класса без использования наследования.
- Фасад (Facade) — Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.
- Приспособленец (Flyweight) — Это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым.
- Заместитель (Proxy) — Объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.
Приведите примеры поведенческих шаблонов проектирования.
- Цепочка обязанностей (Chain of responsibility) — Предназначен для организации в системе уровней ответственности.
- Команда (Command) — Представляет действие. Объект команды заключает в себе само действие и его параметры.
- Интерпретатор (Interpreter) — Решает часто встречающуюся, но подверженную изменениям, задачу.
- Итератор (Iterator) — Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого + __из объектов, входящих в состав агрегации.
- Посредник (Mediator) — Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.
- Хранитель (Memento) — Позволяет, не нарушая инкапсуляцию зафиксировать и сохранить внутренние состояния объекта так, чтобы позднее восстановить его в этих состояниях.
- Наблюдатель (Observer) — Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.
- Состояние (State) — Используется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния.
- Стратегия (Strategy) — Предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости.
- Шаблонный метод (Template method) — Определяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.
- Посетитель (Visitor) — Описывает операцию, которая выполняется над объектами других классов. При изменении класса Visitor нет необходимости изменять обслуживаемые классы.
Что такое «антипаттерн»? Какие антипаттерны вы знаете?
Антипаттерн (anti-pattern) — это распространённый подход к решению класса часто встречающихся проблем, являющийся неэффективным, рискованным или непродуктивным.
Poltergeists (полтергейсты) — это классы с ограниченной ответственностью и ролью в системе, чьё единственное предназначение — передавать информацию в другие классы. Их эффективный жизненный цикл непродолжителен. Полтергейсты нарушают стройность архитектуры программного обеспечения, создавая избыточные (лишние) абстракции, они чрезмерно запутанны, сложны для понимания и трудны в сопровождении. Обычно такие классы задумываются как классы-контроллеры, которые существуют только для вызова методов других классов, зачастую в предопределенной последовательности.
Признаки появления и последствия антипаттерна
- Избыточные межклассовые связи.
- Временные ассоциации.
- Классы без состояния (содержащие только методы и константы).
- Временные объекты и классы (с непродолжительным временем жизни).
- Классы с единственным методом, который предназначен только для создания или вызова других классов посредством временной ассоциации.
- Классы с именами методов в стиле «управления», такие как startProcess.
- Отсутствие объектно-ориентированной архитектуры (архитектор не понимает объектно-ориентированной парадигмы).
- Неправильный выбор пути решения задачи.
- Предположения об архитектуре приложения на этапе анализа требований (до объектно-ориентированного анализа) могут также вести к проблемам на подобии этого антипаттерна.
Внесенная сложность (Introduced complexity): Необязательная сложность дизайна. Вместо одного простого класса выстраивается целая иерархия интерфейсов и классов. Типичный пример «Интерфейс — Абстрактный класс — Единственный класс реализующий интерфейс на основе абстрактного».
Инверсия абстракции (Abstraction inversion): Сокрытие части функциональности от внешнего использования, в надежде на то, что никто не будет его использовать.
Неопределённая точка зрения (Ambiguous viewpoint): Представление модели без спецификации её точки рассмотрения.
Большой комок грязи (Big ball of mud): Система с нераспознаваемой структурой.
Божественный объект (God object): Концентрация слишком большого количества функций в одной части системы (классе).
Затычка на ввод данных (Input kludge): Забывчивость в спецификации и выполнении поддержки возможного неверного ввода.
Раздувание интерфейса (Interface bloat): Разработка интерфейса очень мощным и очень сложным для реализации.
Волшебная кнопка (Magic pushbutton): Выполнение результатов действий пользователя в виде неподходящего (недостаточно абстрактного) интерфейса. Например, написание прикладной логики в обработчиках нажатий на кнопку.
Перестыковка (Re-Coupling): Процесс внедрения ненужной зависимости.
Дымоход (Stovepipe System): Редко поддерживаемая сборка плохо связанных компонентов.
Состояние гонки (Race hazard): непредвидение возможности наступления событий в порядке, отличном от ожидаемого.
Членовредительство (Mutilation): Излишнее «затачивание» объекта под определенную очень узкую задачу таким образом, что он не способен будет работать с никакими иными, пусть и очень схожими задачами.
Сохранение или смерть (Save or die): Сохранение изменений лишь при завершении приложения.
Что такое Dependency Injection?
Dependency Injection (внедрение зависимости) — это набор паттернов и принципов разработки програмного обеспечения, которые позволяют писать слабосвязный код. В полном соответствии с принципом единой обязанности объект отдаёт заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму.
Паттерны в Джаве
Java – объектно-ориентированный язык программирования. Он относится к общему назначению. Используется программистами на практике достаточно часто. Обладает широким функционалом и неплохой работоспособностью.
Можно отнести Java к языкам программирования кроссплатформенного характера. На нем пишут мобильный и компьютерный софт. Пример успешного проекта – Minecraft.
Во время коддинга и проектирования утилит необходимо использовать разного рода объекты и компоненты. В данной статье речь зайдет о том, что собой представляют паттерны. Предстоит разобраться в основах их применения. Данные пригодится как начинающим программистам, так и тем, кто уже долгое время в разработке.
Определение
Шаблоны проектирования – это паттерны. Представляют собой готовые для применения на практике решения часто возникающих в коддинге задач. Не выступают в качестве классом или библиотек, подключаемых к проекту. Паттерны проектирования – нечто большее.
Реализация оных осуществляется в каждом отдельно взятом случае. Требуют подобные объекты пристального внимания со стороны разработчика. Если паттерн неправильно или неграмотно применить, это приведет к серьезным затруднениям.
Паттерн – повторяемая архитектурная конструкция, представляющая готовое решение проблемы проектирования в рамках некоторого регулярно возникающего контекста. Готовый шаблон, которые не является законченным образцом. Он может быть прямо преобразован в кодификацию.
Объектно-ориентированные паттерны соответствующего «вида» — это отношение и взаимодействие между классами и объектами. Стоит обратить внимание на то, что конечные классы и объекты, используемые утилитой, не предопределяются.
Преимущества и недостатки
Паттерны в Java – то, что поможет программерам быстрее решать некоторые, наиболее распространенные задачи, с минимальными временными и силовыми затратами. Перед их внедрением в код стоит выяснить преимущества и недостатки инструментария.
Плюсы
К сильным сторонам компонента относят следующие моменты:
- Снижение сложности разработки. Достигается за счет наличия готовый абстракций для решения целого блока выявленных проблем.
- Каждый шаблон дает алгоритму собственное имя. Это облегчает контакты между разрабами. Люди способны ссылаться на известные шаблоны без существенных трудностей.
- Унификация деталей решений – модулей, элементов проекта. Это снижает количество ошибок при релизе.
- Напоминает внедрение библиотек.
Если грамотно подобрать шаблон, можно пользоваться им для конкретной задачи снова и снова. Это экономит время и силы разработчика.
Минусы
К слабым сторонам рассматриваемого объекта коддинга относят:
- Усложнение приложения. Это происходит, если программер слепо следует установленному «макету».
- Желание попробовать конкретный шаблон без реальных оснований. Это – не лучшее решение, которое способно довести кодификацию до критических ошибок, сбоев и неполадок.
- Для того, чтобы софт функционировал предельно грамотно и правильно, нельзя использовать паттерны, дублируя их.
Стоит обратить внимание и на то, что любой шаблон проектирования может быть заменен разработчиком при помощи обычного программного кода.
О типах
Все patterns можно разделить на несколько разновидностей. Они будут отвечать за примеры решений конкретных задач:
- Порождающие. Представлены механизмами инициализации. Помогают создавать объекты удобными методами.
- Структурные. Отвечают за определение отношений типа «класс-объект». Это дает возможность совместного взаимодействия и работы.
- Поведенческие. Применяются тогда, когда необходимо справиться с упрощением взаимодействия между различными сущностями в кодификации.
Pattern – достаточно удобный компонент, который требует вдумчивого и грамотного применения. Он, как и все остальные объекты программного кода, обладает сильными и слабыми сторонами.
Порождающий тип
Объекты можно создавать при помощи паттернов. Но сначала требуется изучить «макеты», которые отвечают за инициализацию. К ним относят следующие разновидности:
- Singleton. Носит название «Одиночка». Отвечает за ограничение создания одного экземпляра класса. Обеспечивает доступ к единственному объекту.
- Abstract Factory – абстрактная фабрика. Супер фабрика используется для получения фабрики. После – оная применяется для организации объектов.
- Factory – фабрика. Применяется тогда, когда есть суперкласс с несколькими подклассами. На основе ввода нужно вернуть один из подкласса.
- Builder. Называется «Строитель». Применяется для создания сложного объекта с использованием простых объектов. Он со временем отвечает за появление большего компонента от малого и простого.
- Prototype – прототип. Шаблон, который создает дублированный объект с большей производительностью. Вместо нового создается возвращаемый клон существующего элемента.
И это – только начало. Юзерам предстоит разобраться в других вариантах шаблонов.
Структурный тип
В книге Head First Patterns обязательно рассматривается структурный тип:
- Adapter. Конвертер между несовместимыми объектами. Через него можно объединить интерфейсы, которые изначально не соединяются.
- Composite. Компоновщик, отвечающий за использование одного класса для представление древовидной структуры.
- Proxy. Это – заместитель. Дает функциональность другого класса.
- Flyweight. Легковес. Вместо того, чтобы использовать большое количество схожих между собой объектов, они применяются повторно.
- Facade. Обеспечивает элементарный интерфейс для клиентов. Юзеры будут применять его для контактирования с системой.
- Bridge. Мост, который делает определенные классы независимыми от тех, что используются при реализации интерфейсов.
- Decorator. Это – способ обеспечения новых функциональных возможностей существующего компонента кода. Его структура в ходе операций не будет привязываться.
Больше подробностей о каждом из вариантов можно посмотреть в специализированной литературе типа Head First Patterns.
Поведенческий тип
Последняя категория шаблонов предусматривает такие варианты:
- Template Method. Определяет основу алгоритма. Дает шанс наследникам переопределять часть алгоритмических шагов. Структура оных не будет корректироваться.
- Mediator. Дает возможность предоставления класса посредника. Он будет обрабатывать все коммуникации между разными classes.
- Chain of Responsibility. Не дает столкнуться с жесткой зависимостью отправителя запроса от его получателя. Сам запрос будет обрабатываться несколькими объектами.
- Observer. С ним одни компоненты следят и реагируют на события с другими.
- Strategy. Стратегия может корректироваться во время исполнения исходной кодификации.
- Command. Команда, которая объявляет метод для проделывания конкретной манипуляции.
- State. Поведение элемента корректируется в зависимости от его состояния.
- Visitor. Упрощает операции над группированием связанных объектов.
- Interpreter. Контролирует грамматику простого языка в зоне обнаруженной проблемы.
- Iterator. Последовательно предоставляет доступ к компонентам элемента коллекции. Система не знает его ключевого представления.
А еще есть Memento. Так называется шаблон-хранитель. Применяется тогда, когда нужно сохранить состояние объекта. Позже оно должно быть восстановлено приложением.
Можно изучить книгу Head First Patterns, чтобы лучше разобраться в теме. Но лучше закончить специализированные дистанционные онлайн курсы. Они обучат основам Джавы и его «макетам» проектирования.
Также в Otus существует специальный курс «Архитектура и шаблоны проектирования», посвященный паттернам. Не пропустите!