I,Структурные паттерны
1,паттерн «Адаптер»
Используется для преобразования одного интерфейса в другой
java.util.Arrays#asList()
javax.swing.JTable(TableModel)
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()
2,паттерн «Мост»
Этот паттерн отделяет абстракцию от реализации абстрактных операций, позволяя абстракции и реализации изменяться независимо
AWT (Предоставляет уровень абстракции, который использует оконные возможности операционной системы.)
JDBC
3,паттерн «Компоновщик»
Благодаря этому клиент воспринимает отдельный объект и совокупность объектов одинаково. Иными словами, метод некоторого типа также принимает в качестве параметра объект собственного типа
javax.swing.JComponent#add(Component)
java.awt.Container#add(Component)
java.util.Map#putAll(Map)
java.util.List#addAll(Collection)
java.util.Set#addAll(Collection)
4,паттерн «Декоратор»
Динамически добавлять объекту дополнительные возможности — это также альтернатива созданию подклассов. Как видно, при создании экземпляра типа ему одновременно передаётся объект того же типа. В JDK это встречается повсюду, поэтому приведённый ниже список — лишь небольшая часть примеров
java.io.BufferedInputStream(InputStream)
java.io.DataInputStream(InputStream)
java.io.BufferedOutputStream(OutputStream)
java.util.zip.ZipOutputStream(OutputStream)
java.util.Collections#checked<list |sortedmap |sortedset |set |map>
5,шаблон «Фасад»
Предоставить простой интерфейс для группы компонентов, интерфейсов, абстракций или подсистемы
java.lang.Class
javax.faces.webapp.FacesServlet
6,паттерн «Приспособленец»
Использование кэша для ускорения доступа к большому числу мелких объектов
java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
7,паттерн «Заместитель»
Шаблон «Заместитель» использует простой объект вместо сложного объекта или объекта, создание которого требует много времени.
java.lang.reflect.Proxy
RMI

Второе,порождающие паттерны
1,паттерн «Абстрактная фабрика»
Паттерн «Абстрактная фабрика» предоставляет протокол создания семейства связанных или независимых объектов без указания их конкретных типов. Он позволяет отделить приложение от конкретной реализации используемого фреймворка. Этот паттерн повсеместно встречается в JDK и во многих фреймворках, например Spring. Его также легко распознать: если метод создаёт новый объект, но возвращает интерфейс или абстрактный класс, это и есть паттерн «Абстрактная фабрика»
java.util.Calendar#getInstance()
java.util.Arrays#asList()
java.util.ResourceBundle#getBundle()
java.sql.DriverManager#getConnection()
java.sql.Connection#createStatement()
java.sql.Statement#executeQuery()
java.text.NumberFormat#getInstance()
javax.xml.transform.TransformerFactory#newInstance()
2,Шаблон «Строитель»(Builder)
Определяется новый класс для создания экземпляров другого класса, что упрощает создание сложных объектов. В паттерне «Строитель» также часто используется цепочка вызовов методов
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
javax.swing.GroupLayout.Group#addComponent()
3,Фабричный метод
Это просто метод, возвращающий конкретный объект
java.lang.Proxy#newProxyInstance()
java.lang.Object#toString()
java.lang.Class#newInstance()
java.lang.reflect.Array#newInstance()
java.lang.reflect.Constructor#newInstance()
java.lang.Boolean#valueOf(String)
java.lang.Class#forName()
4,Паттерн «Прототип»
Позволяет экземплярам класса создавать собственные копии. Если создание экземпляра объекта очень сложно и требует много времени, можно использовать этот паттерн: вместо создания нового экземпляра скопировать объект и сразу изменить его
java.lang.Object#clone()
java.lang.Cloneable
5,паттерн «Одиночка»
используется, чтобы у класса был только один экземпляр. Джошуа Блох в книге Effetive Java рекомендует ещё один способ — использовать перечисление
java.lang.Runtime#getRuntime()
java.awt.Toolkit#getDefaultToolkit()
java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
java.awt.Desktop#getDesktop()
Три,модели поведения
1,шаблон «Цепочка обязанностей»
Уменьшение связанности объектов путём передачи запроса от одного объекта следующему в цепочке, пока запрос не будет обработан
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
2,паттерн «Команда»
Инкапсулировать операции в объекте для хранения, передачи и возврата
java.lang.Runnable
javax.swing.Action
3,паттерн «Интерпретатор»
Этот паттерн обычно определяет грамматику языка, а затем разбирает выражения, соответствующие этой грамматике
java.util.Pattern
java.text.Normalizer
java.text.Format
4,Шаблон «Итератор»
Предоставляет единый способ последовательного доступа к объектам коллекции, не зависящий от конкретной реализации самой коллекции
java.util.Iterator
java.util.Enumeration
5,паттерн «Посредник»
Использование промежуточного объекта для распределения сообщений и уменьшения прямых зависимостей между классами
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()
6,паттерн «Снимок»
Создаёт снимок состояния объекта, чтобы тот мог восстановить исходное состояние, не раскрывая своего содержимого. Объект Date реализует паттерн «Снимок» с помощью хранящегося внутри значения типа long
java.util.Date
java.io.Serializable
7,паттерн «Нулевой объект»
Этот паттерн заменяет отсутствие объекта объектом без содержательной функциональности. Благодаря этому не требуется отдельно обрабатывать отсутствие объекта
java.util.Collections#emptyList()
java.util.Collections#emptyMap()
java.util.Collections#emptySet()
8,Шаблон «Наблюдатель»
Он позволяет объекту гибко отправлять сообщения заинтересованным объектам
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
9,Паттерн «Состояние»
Изменяя внутреннее состояние объекта, можно динамически менять его поведение во время выполнения
java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()
10,паттерн «Стратегия»
Используйте этот паттерн, чтобы инкапсулировать набор алгоритмов в виде серии объектов. Передавая эти объекты, можно гибко менять функциональность программы
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
11,Паттерн «Шаблонный метод»
Позволяет подклассам переопределять часть метода, а не весь метод целиком; вы можете управлять тем, какие операции подклассы должны переопределять
java.util.Collections#sort()
java.io.InputStream#skip()
java.io.InputStream#read()
java.util.AbstractList#indexOf()
12,Паттерн «Посетитель»
Предоставляет удобный и простой в сопровождении способ работы с группой объектов. Позволяет изменять или расширять поведение объектов, не изменяя сами обрабатываемые объекты
javax.lang.model.element.Element и javax.lang.model.element.ElementVisitor
javax.lang.model.type.TypeMirror и javax.lang.model.type.TypeVisitor
Примечание переводчика:многие моменты могут вызывать споры; принадлежность к тому или иному паттерну сама по себе не особенно важна, важно то, какие уроки их устройство может дать для улучшения нашего кода