Ответ 1
Вы можете найти обзор многих шаблонов дизайна в Википедии. Также упоминается, какие шаблоны упоминаются GoF. Я суммирую их здесь и попытаюсь назначить как можно больше реализаций шаблонов, как в Java SE, так и в Java EE API.
Творческие образцы
Абстрактная фабрика (распознаваемая креативными методами, возвращающими саму фабрику, которая, в свою очередь, может использоваться для создания другого абстрактного/интерфейсного типа)
-
javax.xml.parsers.DocumentBuilderFactory#newInstance()
-
javax.xml.transform.TransformerFactory#newInstance()
-
javax.xml.xpath.XPathFactory#newInstance()
Builder (распознается креативными методами, возвращающими сам экземпляр)
-
java.lang.StringBuilder#append()
(несинхронизированный) -
java.lang.StringBuffer#append()
(синхронизировано) -
java.nio.ByteBuffer#put()
(также дляCharBuffer
,ShortBuffer
,IntBuffer
,LongBuffer
,FloatBuffer
иDoubleBuffer
) -
javax.swing.GroupLayout.Group#addComponent()
- Все реализации
java.lang.Appendable
-
java.util.stream.Stream.Builder
Фабричный метод (распознаваемый креативными методами, возвращающими реализацию абстрактного/интерфейсного типа)
-
java.util.Calendar#getInstance()
-
java.util.ResourceBundle#getBundle()
-
java.text.NumberFormat#getInstance()
-
java.nio.charset.Charset#forName()
-
java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
(возвращает одноэлементный объект для протокола) -
java.util.EnumSet#of()
-
javax.xml.bind.JAXBContext#createMarshaller()
и другие подобные методы
Прототип (распознается креативными методами, возвращающими другой экземпляр самого себя с теми же свойствами)
-
java.lang.Object#clone()
(класс должен реализовыватьjava.lang.Cloneable
)
Синглтон (распознаваемый креативными методами, возвращающими один и тот же экземпляр (обычно самого себя) каждый раз)
Структурные узоры
Адаптер (распознаваемый креативными методами, берущими экземпляр другого абстрактного/интерфейсного типа и возвращающий реализацию собственного/другого абстрактного/интерфейсного типа, который украшает/переопределяет данный экземпляр)
-
java.util.Arrays#asList()
-
java.util.Collections#list()
-
java.util.Collections#enumeration()
-
java.io.InputStreamReader(InputStream)
(возвращаетReader
) -
java.io.OutputStreamWriter(OutputStream)
(возвращаетWriter
) -
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
и#unmarshal()
Мост (распознаваемый креативными методами, берущими экземпляр другого абстрактного/интерфейсного типа и возвращающий реализацию собственного абстрактного/интерфейсного типа, который делегирует/использует данный экземпляр)
- Никто еще не приходит в голову. В качестве примера можно привести
new LinkedHashMap(LinkedHashSet<K>, List<V>)
который возвращает неизменяемую связанную карту, которая не клонирует элементы, а использует их. Однакоjava.util.Collections#newSetFromMap()
иsingletonXXX()
близки.
Составной (распознается поведенческими методами, берущими экземпляр одного и того же абстрактного/интерфейсного типа в древовидную структуру)
-
java.awt.Container#add(Component)
(таким образом, практически во всем Swing) -
javax.faces.component.UIComponent#getChildren()
(таким образом, практически во всем пользовательском интерфейсе JSF)
Декоратор (распознаваемый креативными методами, использующими экземпляр того же типа абстрактного/интерфейса, который добавляет дополнительное поведение)
- Все подклассы
java.io.InputStream
,OutputStream
,Reader
иWriter
имеют конструктор, принимающий экземпляр одного типа. -
java.util.Collections
,checkedXXX()
,synchronizedXXX()
иunmodifiableXXX()
. -
javax.servlet.http.HttpServletRequestWrapper
иHttpServletResponseWrapper
-
javax.swing.JScrollPane
Фасад (распознаваемый поведенческими методами, которые внутренне используют экземпляры различных независимых абстрактных/интерфейсных типов)
-
javax.faces.context.FacesContext
, он внутренне использует, среди прочего, абстрактные/интерфейсные типыLifeCycle
,ViewHandler
,NavigationHandler
и многие другие без того, чтобыViewHandler
беспокоиться об этом (которые, однако, могут быть переопределены инъекцией). -
javax.faces.context.ExternalContext
, который внутренне используетServletContext
,HttpSession
,HttpServletRequest
,HttpServletResponse
и т.д.
Flyweight (распознается креативными методами, возвращающими кешированный экземпляр, немного "многотонная" идея)
-
java.lang.Integer#valueOf(int)
(также дляBoolean
,Byte
,Character
,Short
,Long
иBigDecimal
)
Прокси (распознаваемый креативными методами, который возвращает реализацию данного абстрактного/интерфейсного типа, который в свою очередь делегирует/использует другую реализацию данного абстрактного/интерфейсного типа)
-
java.lang.reflect.Proxy
-
java.rmi.*
-
javax.ejb.EJB
(объяснение здесь) -
javax.inject.Inject
(объяснение здесь) -
javax.persistence.PersistenceContext
Поведенческие модели
Цепочка ответственности (распознается поведенческими методами, которые (косвенно) вызывают тот же метод в другой реализации того же абстрактного/интерфейсного типа в очереди)
Команда (распознаваемая поведенческими методами в абстрактном/интерфейсном типе, который вызывает метод в реализации другого абстрактного/интерфейсного типа, который был инкапсулирован реализацией команды во время ее создания)
- Все реализации
java.lang.Runnable
- Все реализации
javax.swing.Action
Интерпретатор (распознаваемый поведенческими методами, возвращающими структурно отличающийся экземпляр/тип данного экземпляра/типа; обратите внимание, что синтаксический анализ/форматирование не является частью шаблона, определение шаблона и способ его применения)
-
java.util.Pattern
-
java.text.Normalizer
- Все подклассы
java.text.Format
- Все подклассы
javax.el.ELResolver
Итератор (распознается поведенческими методами, последовательно возвращая экземпляры другого типа из очереди)
- Все реализации
java.util.Iterator
(таким образом, среди других такжеjava.util.Scanner
!). - Все реализации
java.util.Enumeration
Посредник (распознаваемый поведенческими методами, берущими экземпляр другого абстрактного/интерфейсного типа (обычно использующий шаблон команды), который делегирует/использует данный экземпляр)
-
java.util.Timer
(все методыscheduleXXX()
) -
java.util.concurrent.Executor#execute()
-
java.util.concurrent.ExecutorService
(invokeXXX()
иsubmit()
) -
java.util.concurrent.ScheduledExecutorService
(все методыscheduleXXX()
) -
java.lang.reflect.Method#invoke()
Памятка (распознаваемая поведенческими методами, которые внутренне изменяют состояние всего экземпляра)
-
java.util.Date
(методы установки делают это,Date
внутренне представленаlong
значением) - Все реализации
java.io.Serializable
- Все реализации
javax.faces.component.StateHolder
Наблюдатель (или Публикация/подписка) (распознается поведенческими методами, которые вызывают метод в экземпляре другого абстрактного/интерфейсного типа, в зависимости от собственного состояния)
-
java.util.Observer
/java.util.Observable
(хотя редко используется в реальном мире) - Все реализации
java.util.EventListener
(практически во всем Swing) -
javax.servlet.http.HttpSessionBindingListener
-
javax.servlet.http.HttpSessionAttributeListener
-
javax.faces.event.PhaseListener
Состояние (распознается поведенческими методами, которые изменяют свое поведение в зависимости от состояния экземпляра, которым можно управлять извне)
-
javax.faces.lifecycle.LifeCycle#execute()
(управляетсяFacesServlet
, поведение зависит от текущей фазы (состояния) жизненного цикла JSF)
Стратегия (распознается поведенческими методами в абстрактном/интерфейсном типе, который вызывает метод в реализации другого абстрактного/интерфейсного типа, который был передан в качестве аргумента метода в реализацию стратегии)
-
java.util.Comparator#compare()
, выполняемый среди другихCollections#sort()
. -
javax.servlet.http.HttpServlet
,service()
и всеdoXXX()
принимаютHttpServletRequest
иHttpServletResponse
и разработчик должен их обработать (а не получить их в качестве переменных экземпляра!). -
javax.servlet.Filter#doFilter()
Шаблонный метод (распознаваемый поведенческими методами, которые уже имеют поведение "по умолчанию", определенное абстрактным типом)
- Все неабстрактные методы
java.io.InputStream
,java.io.OutputStream
,java.io.Reader
иjava.io.Writer
. - Все неабстрактные методы
java.util.AbstractList
,java.util.AbstractSet
иjava.util.AbstractMap
. -
javax.servlet.http.HttpServlet
, все методыdoXXX()
по умолчанию отправляют в ответ ошибку HTTP 405 "Метод не разрешен". Вы свободны, чтобы реализовать ни один или любой из них.