I,Patrones estructurales
1,patrón adaptador
Se utiliza para convertir una interfaz en otra
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,Patrón puente
Este patrón desacopla la abstracción de la implementación de sus operaciones, permitiendo que ambas varíen de forma independiente
AWT (Proporciona una capa de abstracción que vincula el soporte de ventanas con el sistema operativo nativo.)
JDBC
3,patrón Composite
Hace que, desde la perspectiva del cliente, un objeto individual y una composición de objetos sean equivalentes. En otras palabras, los métodos de un tipo también aceptan como parámetros objetos de ese mismo tipo
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,Patrón decorador
Añadir dinámicamente funciones adicionales a un objeto también constituye una alternativa a la creación de subclases. Como puede verse, al crear una instancia de un tipo, también se le pasa un objeto de ese mismo tipo. Esto aparece por todo el JDK; descubrirás que está en todas partes, así que la siguiente lista solo recoge una pequeña parte
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,patrón fachada
Proporcionar una interfaz sencilla para un conjunto de componentes, interfaces, abstracciones o subsistemas
java.lang.Class
javax.faces.webapp.FacesServlet
6,patrón Flyweight
Utilizar la caché para reducir el tiempo de acceso a una gran cantidad de objetos pequeños
java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
7,patrón Proxy
El patrón proxy utiliza un objeto sencillo para sustituir a otro complejo o cuya creación requiere mucho tiempo.
java.lang.reflect.Proxy
RMI

II, Patrones de creación
1,patrón de fábrica abstracta
El patrón de fábrica abstracta proporciona un protocolo para generar una familia de objetos relacionados o independientes sin especificar sus tipos concretos. Permite desacoplar la aplicación de la implementación concreta del framework que utiliza. Esto se encuentra por todas partes en el JDK y en muchos frameworks, como Spring. También resulta fácil de reconocer: si un método crea un objeto nuevo pero devuelve una interfaz o una clase abstracta, se trata del patrón de fábrica abstracta
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,patrón de construcción (Builder)
Define una clase nueva para construir instancias de otra clase y simplificar la creación de objetos complejos. El patrón de construcción también suele implementarse mediante el encadenamiento de métodos
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
javax.swing.GroupLayout.Group#addComponent()
3,método de fábrica
Es simplemente un método que devuelve un objeto concreto
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,patrón prototipo
Permite que las instancias de una clase generen copias de sí mismas. Si crear una instancia de un objeto es muy complejo y requiere mucho tiempo, se puede utilizar este patrón: en lugar de crear una nueva instancia desde cero, puedes copiar un objeto y modificarlo directamente
java.lang.Object#clone()
java.lang.Cloneable
5,patrón singleton
Se utiliza para garantizar que una clase tenga una sola instancia. Joshua Bloch sugiere en Effetive Java que existe otro método: utilizar una enumeración
java.lang.Runtime#getRuntime()
java.awt.Toolkit#getDefaultToolkit()
java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
java.awt.Desktop#getDesktop()
III,Patrones de comportamiento
1, patrón de cadena de responsabilidad
Permite desacoplar los objetos pasando la solicitud de un objeto al siguiente de la cadena hasta que se haya procesado
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
2,patrón de comando
Encapsular las operaciones en objetos para poder almacenarlas, pasarlas y devolverlas
java.lang.Runnable
javax.swing.Action
3,patrón intérprete
Este patrón suele definir la gramática de un lenguaje y después analiza las sentencias que siguen dicha gramática
java.util.Pattern
java.text.Normalizer
java.text.Format
4,patrón iterador
Proporcionar una forma uniforme de acceder secuencialmente a los objetos de una colección, independiente de la implementación concreta de la colección subyacente
java.util.Iterator
java.util.Enumeration
5,Patrón mediador
Utilizar un objeto intermediario para distribuir mensajes y reducir las dependencias directas entre clases
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()
6,patrón Memento
Genera una instantánea del estado de un objeto para que pueda recuperar su estado original sin exponer su contenido interno. El objeto Date implementa el patrón Memento mediante un valor long interno.
java.util.Date
java.io.Serializable
7,patrón Objeto Nulo
Este patrón sustituye la ausencia de un objeto por un objeto sin significado. Así evita que tengas que gestionar por separado los objetos nulos
java.util.Collections#emptyList()
java.util.Collections#emptyMap()
java.util.Collections#emptySet()
8, Patrón observador
Permite que un objeto envíe mensajes de forma flexible a los objetos interesados
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
9,Patrón de estado
Permite modificar dinámicamente el comportamiento de un objeto durante la ejecución mediante cambios en su estado interno
java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()
10,patrón de estrategia
Este patrón se utiliza para encapsular un conjunto de algoritmos en una serie de objetos. Al pasar estos objetos, se puede modificar con flexibilidad la funcionalidad del programa
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
11, patrón Método Plantilla
Permitir que las subclases sobrescriban una parte del método en lugar del método completo; puedes controlar qué operaciones deben sobrescribir las subclases
java.util.Collections#sort()
java.io.InputStream#skip()
java.io.InputStream#read()
java.util.AbstractList#indexOf()
12,patrón Visitor
Proporciona una forma cómoda y fácil de mantener de operar sobre un conjunto de objetos. Permite modificar o ampliar su comportamiento sin cambiar los objetos sobre los que se opera
javax.lang.model.element.Element y javax.lang.model.element.ElementVisitor
javax.lang.model.type.TypeMirror y javax.lang.model.type.TypeVisitor
Nota del traductor: muchos puntos pueden ser discutibles. No resulta especialmente importante determinar si algo corresponde a un patrón concreto; lo importante es que su diseño nos aporte enseñanzas para mejorar nuestro código