Введение
Шаблоны проектирования пользуются большой популярностью среди разработчиков программного обеспечения. Шаблон проектирования – это хорошо описанное решение общей проблемы в программном обеспечении.
Некоторые из преимуществ использования шаблонов проектирования включают:
- Шаблоны проектирования уже определены и предоставляют отраслевой стандартный подход к решению повторяющейся проблемы, поэтому это экономит время, если мы разумно используем шаблон проектирования. Существует много шаблонов проектирования на языке Java, которые мы можем использовать в наших проектах на Java.
- Использование шаблонов проектирования способствует повторному использованию, что приводит к более надежному и легко поддерживаемому коду. Это помогает снизить общую стоимость владения (TCO) программным продуктом.
- Поскольку шаблоны проектирования уже определены, наш код легко понимать и отлаживать. Это приводит к более быстрому развитию, и новые члены команды легко его понимают.
Шаблоны проектирования на языке Java разделены на три категории – создающие, структурные и поведенческие шаблоны проектирования.
Эта статья служит индексом для всех статей по шаблонам проектирования на языке Java.
Шаблоны создания объектов
Паттерны проектирования создания предоставляют решения для создания объекта наилучшим образом для конкретных ситуаций.
1. Паттерн Одиночка
Паттерн одиночка ограничивает создание объекта класса и гарантирует, что виртуальная машина Java существует только один экземпляр класса. Реализация паттерна одиночки всегда была спорной темой среди разработчиков.
Примечание: Узнайте больше о паттерне проектирования Одиночка.
2. Паттерн Фабрика
Паттерн фабрики используется, когда у нас есть суперкласс с несколькими подклассами и в зависимости от ввода нам нужно вернуть один из подклассов. Этот паттерн переносит ответственность за создание объекта класса из программы-клиента в класс фабрики. Мы можем применить паттерн одиночки к классу фабрики или сделать метод фабрики static
.
Примечание: Узнайте больше о паттерне проектирования Фабрика.
3. Абстрактная фабрика
Паттерн абстрактной фабрики аналогичен паттерну фабрики и представляет собой фабрику фабрик. Если вы знакомы с паттерном проектирования фабрики в Java, то вы заметите, что у нас есть единственный класс фабрики, который возвращает различные подклассы на основе предоставленного входного параметра, а класс фабрики использует операторы if-else
или switch
для достижения этого. В паттерне абстрактной фабрики мы избавляемся от блока if-else
и имеем класс фабрики для каждого подкласса, а затем абстрактный класс фабрики, который будет возвращать подкласс на основе класса фабрики ввода.
Примечание: Узнайте больше о Абстрактном паттерне фабрики.
4. Паттерн Строитель
Паттерн строителя был представлен для решения некоторых проблем с паттернами проектирования фабрики и абстрактной фабрики, когда объект содержит множество атрибутов. Этот паттерн решает проблему с большим количеством необязательных параметров и несогласованным состоянием, предоставляя способ поэтапного построения объекта и метод, который фактически вернет конечный Объект
.
Примечание: Узнайте больше о шаблоне строителя (Builder Pattern).
5. Шаблон прототипа (Prototype Pattern)
Шаблон прототипа используется, когда создание Object
затратно и требует много времени и ресурсов, и у вас уже есть похожий Object
. Поэтому этот шаблон предоставляет механизм для копирования оригинального Object
в новый Object
, а затем его модификации в соответствии с нашими потребностями. Этот шаблон использует клонирование в Java для копирования Object
. Прототип шаблона дизайна требует, чтобы Object
, который вы копируете, предоставлял возможность копирования. Это не должно выполняться никаким другим классом. Однако решение о том, использовать ли поверхностное или глубокое копирование свойств объекта, зависит от требований и является решением дизайна.
Примечание: Узнайте больше о шаблоне прототипа (Prototype Pattern).
Структурные шаблоны проектирования (Structural Design Patterns)
Структурные шаблоны проектирования предоставляют различные способы создания структуры Class
(например, с использованием наследования и композиции для создания большого Object
из маленьких Object
).
1. Шаблон адаптера
Шаблон адаптера является одним из структурных шаблонов проектирования и используется для того, чтобы два несвязанных интерфейса могли работать вместе. Объект, который объединяет эти несвязанные интерфейсы, называется адаптером.
Примечание: Узнайте больше о шаблоне адаптера.
2. Шаблон компоновщика
Шаблон компоновщика используется, когда нам нужно представить иерархию часть-целое. Когда нам нужно создать структуру таким образом, чтобы объекты в структуре должны были обрабатываться одинаково, мы можем применить шаблон компоновщика.
Примечание: Узнайте больше о шаблоне компоновщика.
3. Шаблон “Прокси”
Шаблон “Прокси” предоставляет заполнитель для другого Объекта
, чтобы контролировать доступ к нему. Этот шаблон используется, когда мы хотим предоставить контролируемый доступ к функциональности.
Примечание: Узнайте больше о Шаблоне “Прокси”.
4. Шаблон “Легковесный”
Шаблон проектирования “Легковесный” используется, когда нам нужно создать много Объектов
класса. Поскольку каждый Объект
потребляет память, которая может быть критичной для устройств с низким объемом памяти (таких как мобильные устройства или встроенные системы), шаблон проектирования “Легковесный” может быть применен для снижения нагрузки на память путем совместного использования Объектов
.
Реализация пула строк в Java является одним из лучших примеров реализации шаблона “Легковесный”.
Примечание: Узнайте больше о Шаблоне “Легковесный”.
5. Паттерн Фасад
Паттерн фасада используется для упрощения взаимодействия клиентских приложений с системой.
Примечание: Узнайте больше о паттерне Фасад.
6. Паттерн Мост
Когда у нас есть иерархии интерфейсов как в интерфейсах, так и в реализациях, тогда используется паттерн проектирования мост для разделения интерфейсов от реализации и скрытия деталей реализации от клиентских программ. Реализация паттерна проектирования моста следует принципу предпочтения композиции перед наследованием.
Примечание: Узнайте больше о паттерне Мост.
7. Паттерн Декоратор
Декоратор – это шаблон проектирования, используемый для модификации функциональности объекта во время выполнения. В то же время другие экземпляры того же класса не будут затронуты этим, поэтому индивидуальный объект получает измененное поведение. Шаблон проектирования “декоратор” является одним из структурных шаблонов проектирования (таких как адаптер, мост или композит) и использует абстрактные классы или интерфейсы с композицией для реализации. Мы используем наследование или композицию для расширения поведения объекта, но это происходит на этапе компиляции и применимо ко всем экземплярам класса. Мы не можем добавлять новую функциональность или удалять существующее поведение во время выполнения, и вот когда полезен шаблон декоратора.
Примечание: Узнайте больше о Шаблоне Декоратора.
Поведенческие шаблоны проектирования
Поведенческие шаблоны предоставляют решение для лучшего взаимодействия между объектами и способы обеспечения слабой связности и гибкости для легкого расширения.
1. Шаблон метода
Шаблонный метод – это поведенческий шаблон проектирования, используемый для создания заглушки метода и отложения некоторых шагов реализации на подклассы. Шаблонный метод определяет шаги для выполнения алгоритма, и он может предоставить реализацию по умолчанию, которая может быть общей для всех или некоторых подклассов.
Примечание: Узнайте больше о Шаблонном методе.
2. Паттерн “Посредник”
Паттерн проектирования “посредник” используется для обеспечения централизованной среды общения между различными объектами в системе. Если объекты взаимодействуют друг с другом напрямую, компоненты системы тесно связаны между собой, что делает стоимость поддержки выше и не позволяет легко расширять функциональность. Паттерн “посредник” сосредотачивается на предоставлении посредника между объектами для общения и реализации слабой связности между объектами. Посредник работает как маршрутизатор между объектами, и он может иметь свою собственную логику для обеспечения способа общения.
Примечание: Узнайте больше о Паттерне “Посредник”
3. Цепочка обязанностей
Паттерн цепочки обязанностей используется для достижения слабой связности в проектировании программного обеспечения, где запрос от клиента передается цепочке объектов для их обработки. Затем объект в цепочке решает, кто будет обрабатывать запрос, и нужно ли отправлять запрос следующему объекту в цепочке или нет.
Мы знаем, что в блоке кода try-catch
может быть несколько блоков catch
. Здесь каждый блок catch
является своего рода обработчиком для обработки определенного исключения. Таким образом, когда происходит исключение в блоке try
, оно отправляется в первый блок catch
для обработки. Если блок catch
не может его обработать, он перенаправляет запрос следующему объекту в цепочке (т.е. следующему блоку catch
). Если даже последний блок catch
не может его обработать, исключение выбрасывается за пределы цепочки в вызывающую программу.
Примечание: Узнайте больше о паттерне цепочки обязанностей.
4. Паттерн Наблюдатель
Шаблон проектирования “наблюдатель” полезен, когда вам интересно состояние объекта и вы хотите получать уведомления о любых изменениях. В шаблоне наблюдателя объект, который следит за состоянием другого объекта, называется наблюдателем, а объект, за которым наблюдают, называется субъектом.
Java предоставляет встроенную платформу для реализации шаблона Observer с помощью класса java.util.Observable
и интерфейса java.util.Observer
. Однако его не так широко используют, потому что реализация ограничена, и большую часть времени мы не хотим расширять класс исключительно для реализации шаблона Observer, так как Java не предоставляет множественного наследования в классах. Java Message Service (JMS) использует шаблон Observer вместе с шаблоном посредника для возможности подписки и публикации данных в другие приложения.
Примечание: Узнайте больше о шаблоне Observer.
5. Шаблон стратегии
Шаблон стратегии используется, когда у нас есть несколько алгоритмов для выполнения определенной задачи, и клиент решает, какая конкретная реализация будет использоваться во время выполнения. Шаблон стратегии также известен как шаблон политики. Мы определяем несколько алгоритмов и позволяем клиентским приложениям передавать алгоритм, который должен быть использован, в качестве параметра.
Один из лучших примеров этого шаблона – это метод Collections.sort()
, который принимает параметр Comparator. Основываясь на различных реализациях интерфейсов компаратора, объекты сортируются разными способами.
Примечание: Узнайте больше о шаблоне стратегии.
6. Шаблон команды
Шаблон команды используется для реализации слабой связности в модели запрос-ответ. В этом шаблоне запрос отправляется вызывающему, и вызывающий передает его инкапсулированному объекту команды. Объект команды передает запрос соответствующему методу получателя для выполнения конкретного действия.
Примечание: Узнайте больше о шаблоне команды.
7. Шаблон состояния
Шаблон состояния используется, когда Object
изменяет свое поведение в зависимости от своего внутреннего состояния. Если нам нужно изменить поведение Object
в зависимости от его состояния, мы можем использовать переменную состояния в Object
и использовать блок условий if-else
, чтобы выполнять различные действия в зависимости от состояния. Шаблон состояния используется для предоставления систематического и слабосвязанного способа достижения этого с использованием контекста и реализаций состояния.
Примечание: Узнайте больше о Шаблоне Состояния.
8. Шаблон посетителя
Шаблон посетителя используется, когда нам нужно выполнить операцию над группой похожих объектов. С помощью шаблона посетителя мы можем переместить операционную логику из объектов в другой класс.
Примечание: Узнайте больше о Шаблоне Посетителя.
9. Шаблон интерпретатора
Шаблон интерпретатора используется для определения грамматического представления языка и предоставляет интерпретатор для работы с этой грамматикой.
10. Паттерн Итератор
Паттерн итератора является одним из поведенческих паттернов и используется для обеспечения стандартного способа обхода группы объектов. Паттерн итератора широко используется в Java Collection Framework, где интерфейс итератора предоставляет методы для обхода Collection
. Этот паттерн также используется для предоставления различных видов итераторов в зависимости от наших требований. Паттерн итератора скрывает фактическую реализацию обхода Collection
, и клиентские программы используют методы итератора.
Примечание: Узнайте больше о паттерне Итератор.
11. Паттерн Хранитель
Паттерн хранителя используется, когда мы хотим сохранить состояние объекта, чтобы мы могли восстановить его позже. Этот паттерн используется для реализации этого таким образом, что сохраненные данные состояния объекта не доступны вне Object
, что защищает целостность сохраненных данных состояния.
Шаблон Memento реализуется с двумя Object
– originator и caretaker. Originator – это Object
, состояние которого нужно сохранить и восстановить, и он использует внутренний класс для сохранения состояния Object
. Внутренний класс называется “Memento”, и он является private
, чтобы к нему нельзя было обратиться из других объектов.
Различные шаблоны проектирования
Существует много шаблонов проектирования, которые не входят в шаблоны проектирования банды четырех. Давайте рассмотрим некоторые из этих популярных шаблонов проектирования.
1. Шаблон проектирования DAO
Объект доступа к данным (DAO) используется для разделения логики постоянства данных на отдельный уровень. DAO – очень популярный шаблон при проектировании систем для работы с базами данных. Идея заключается в том, чтобы отделить слой сервиса от слоя доступа к данным. Таким образом, мы реализуем разделение логики в нашем приложении.
Примечание: Узнайте больше о шаблоне DAO.
2. Паттерн внедрения зависимостей
Паттерн внедрения зависимостей позволяет нам устранить жесткие зависимости и сделать наше приложение слабо связанным, расширяемым и поддерживаемым. Мы можем реализовать внедрение зависимостей в Java, чтобы переместить разрешение зависимостей с момента компиляции на время выполнения. Фреймворк Spring построен на принципе внедрения зависимостей.
Примечание: Узнайте больше о паттерне внедрения зависимостей.
3. Паттерн MVC
Паттерн Модель-Представление-Контроллер (MVC) является одним из старейших архитектурных шаблонов для создания веб-приложений.
Заключение
Эта статья подвела итоги Java-шаблонов проектирования.
Вы можете ознакомиться с примерами кода Java-шаблонов проектирования в нашем репозитории GitHub.
Продолжайте свое обучение с помощью большего количества учебных пособий по Java.
Source:
https://www.digitalocean.com/community/tutorials/java-design-patterns-example-tutorial