1. Простая фабрика
Также известен как шаблон метода статической фабрики (метод StaticFactory), но не является одним из 23 шаблонов проектирования GOF.
Суть простого фабричного шаблона заключается в том, что фабричный класс динамически решает, какой класс продукта следует создать в соответствии с входящими параметрами.
BeanFactory в Spring — это воплощение простого фабричного шаблона.Объект Bean получается путем передачи уникального идентификатора, но создавать ли его после передачи параметров или до передачи параметров, зависит от конкретной ситуации.
2. Заводской метод
Определите интерфейс для создания объектов и позвольте подклассам решать, какой класс создавать. Фабричный метод задерживает создание экземпляра класса для его подклассов.
FactoryBean в Spring — это типичный шаблон фабричного метода. Как показано ниже:
3. Синглтон
Гарантирует наличие только одного экземпляра класса и предоставляет к нему глобальную точку доступа.
Шаблон singleton в Spring завершает вторую половину предложения, которое предоставляет глобальную точку доступа BeanFactory. Но с уровня конструктора нет единого элемента управления, потому что Spring управляет произвольными объектами Java.
4. Адаптер
Преобразуйте интерфейс класса в другой интерфейс, который хочет клиент. Шаблон адаптера позволяет классам работать вместе, которые в противном случае не работали бы вместе из-за несовместимых интерфейсов.
Существует пример режима адаптера при обработке AOP в Spring, как показано на следующем рисунке.
Поскольку цепочке Advisor нужен объект MethodInterceptor, Advice в каждом Advisor должен быть адаптирован к соответствующему объекту MethodInterceptor.
5. Обертка (Декоратор)
Динамически добавляйте дополнительные обязанности к объекту. С точки зрения добавления функциональности шаблон Decorator более гибок, чем подклассы.
Шаблон оболочки, используемый в Spring, имеет два проявления в имени класса: во-первых, имя класса содержит Wrapper, а во-вторых, имя класса содержит Decorator. По сути, все дело в динамическом добавлении дополнительных обязанностей к объекту.
6. Прокси
Предоставляет прокси для других объектов для управления доступом к этому объекту.
По структуре он похож на паттерн Decorator, но Proxy — это элемент управления, больше похожий на ограничение функций, а Decorator — на увеличение обязанностей.
Режим прокси Spring отражается в aop, например JdkDynamicAopProxy и Cglib2AopProxy.
7. Наблюдатель
Определяет зависимость между объектами "один ко многим". При изменении состояния объекта все зависящие от него объекты получают уведомление и автоматически обновляются.
Наиболее часто используемым местом для шаблона Observer в Spring является реализация слушателя. Например, ApplicationListener.
8. Стратегия
Определите серию алгоритмов, инкапсулируйте их один за другим и сделайте их взаимозаменяемыми. Этот шаблон позволяет алгоритму изменяться независимо от клиента, использующего его.
В Spring режим Strategy используется при создании экземпляров объектов, как показано на следующем рисунке:
Следующий код в SimpleInstantiationStrategy иллюстрирует использование шаблона стратегии:
9. Шаблонный метод
Определить скелет алгоритма в операции, отложив некоторые шаги на подклассы. Шаблонный метод позволяет подклассам переопределять определенные шаги алгоритма без изменения его структуры.
Режим шаблонного метода обычно наследуется. Здесь вы хотите изучить другое понимание шаблонного метода. JDBCTemplate в Spring не хочет наследовать этот класс при использовании этого класса, потому что этого класса слишком много, но мы все еще хотим использовать JDBCTemplate существующее стабильное общедоступное соединение с базой данных, тогда что нам делать? Мы можем указать измененные вещи как параметр в методе JDBCTemplate. Но изменения — это код, и этот код будет использовать переменные в jdbcTemplate. что делать? Затем воспользуемся объектом обратного вызова. Определите метод манипулирования переменной в JDBCTemplate в этом объекте обратного вызова, мы переходим к реализации этого метода, сосредоточьтесь на изменении здесь. Затем мы передадим этот объект обратного вызова в JDBCTemplate, тем самым завершив вызов. Это может быть другая реализация шаблонного метода, которому не нужно наследовать.
Вот конкретный пример:
Метод выполнения в JdbcTemplate:
JdbcTemplate выполняет метод execute: