I,Pattern strutturali
1,pattern Adapter
Serve a convertire un'interfaccia in un'altra
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,Pattern Bridge
Questo pattern disaccoppia l’astrazione dall’implementazione delle sue operazioni, permettendo ad astrazione e implementazione di variare indipendentemente
AWT (Fornisce un livello di astrazione che associa il supporto delle finestre al sistema operativo nativo.)
JDBC
3,pattern Composite
Fa sì che, dal punto di vista del client, un singolo oggetto e una composizione di oggetti siano equivalenti. In altre parole, il metodo di un tipo accetta come parametro anche il proprio 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,pattern Decorator
Aggiungere dinamicamente funzionalità supplementari a un oggetto è anche un'alternativa alla creazione di sottoclassi. Come si può vedere, quando si crea un'istanza di un tipo, si passa contemporaneamente anche un oggetto dello stesso tipo. Nel JDK questo approccio si incontra ovunque: vi accorgerete che è onnipresente, quindi l'elenco seguente ne rappresenta solo una piccola 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,Pattern Facade
Fornire un'interfaccia semplice a un insieme di componenti, interfacce, astrazioni o sottosistemi
java.lang.Class
javax.faces.webapp.FacesServlet
6,pattern Flyweight
Usare la cache per ridurre i tempi di accesso a un gran numero di piccoli oggetti
java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
7,pattern Proxy
Il pattern Proxy consiste nell'usare un oggetto semplice al posto di un oggetto complesso o la cui creazione richiede molto tempo.
java.lang.reflect.Proxy
RMI

II,Pattern creazionali
1,pattern Abstract Factory
Il pattern Abstract Factory fornisce un protocollo per generare una serie di oggetti correlati o indipendenti senza specificarne il tipo concreto. Consente all'applicazione di disaccoppiarsi dall'implementazione concreta del framework utilizzato. È diffusissimo nel JDK e in molti framework, come Spring. È anche facile da riconoscere: un metodo che crea nuovi oggetti ma restituisce un'interfaccia o una classe astratta è un esempio del pattern Abstract Factory
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,pattern di costruzione(Builder)
Definisce una nuova classe per costruire istanze di un'altra classe, semplificando la creazione di oggetti complessi. Anche il pattern Builder viene spesso implementato mediante il concatenamento dei metodi
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
javax.swing.GroupLayout.Group#addComponent()
3,Factory Method
è semplicemente un metodo che restituisce un oggetto 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,pattern Prototype
consente alle istanze di una classe di generare copie di sé stesse. Se creare un'istanza di un oggetto è molto complesso e richiede molto tempo, si può usare questo modello: invece di creare una nuova istanza, puoi copiare un oggetto e modificarlo direttamente
java.lang.Object#clone()
java.lang.Cloneable
5,pattern Singleton
Serve a garantire che una classe abbia una sola istanza. In Effetive Java, Joshua Bloch suggerisce anche un altro metodo: utilizzare un'enumerazione
java.lang.Runtime#getRuntime()
java.awt.Toolkit#getDefaultToolkit()
java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
java.awt.Desktop#getDesktop()
Tre,pattern comportamentali
1,pattern Catena di responsabilità
Disaccoppiare gli oggetti passando una richiesta da un oggetto al successivo nella catena, finché non viene gestita completamente
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
2,Pattern Command
Incapsulare le operazioni negli oggetti per poterle memorizzare, passare e restituire
java.lang.Runnable
javax.swing.Action
3,pattern Interpreter
Questo pattern definisce solitamente la grammatica di un linguaggio e poi analizza le istruzioni che seguono tale grammatica
java.util.Pattern
java.text.Normalizer
java.text.Format
4,Pattern Iterator
Fornire un metodo uniforme per accedere in sequenza agli oggetti di una collezione, indipendentemente dall'implementazione concreta della collezione sottostante
java.util.Iterator
java.util.Enumeration
5,pattern Mediator
Utilizzando un oggetto intermediario per distribuire i messaggi e ridurre le dipendenze dirette tra le classi
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()
6,pattern Memento
Genera un'istantanea dello stato di un oggetto, in modo che possa recuperare lo stato originale senza esporre il proprio contenuto. L'oggetto Date implementa il pattern Memento tramite un valore long al suo interno
java.util.Date
java.io.Serializable
7,pattern Null Object
Questo pattern usa un oggetto privo di significato per rappresentare lo stato di assenza di un oggetto. In questo modo non è necessario gestire separatamente l'oggetto nullo
java.util.Collections#emptyList()
java.util.Collections#emptyMap()
java.util.Collections#emptySet()
8,Pattern Observer
Consente a un oggetto di inviare messaggi in modo flessibile agli oggetti interessati
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
9,pattern State
Modificando lo stato interno di un oggetto, è possibile cambiarne dinamicamente il comportamento durante l'esecuzione
java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()
10,pattern Strategy
Questo pattern permette di incapsulare un gruppo di algoritmi in una serie di oggetti. Passando questi oggetti, è possibile modificare in modo flessibile le funzionalità del programma
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
11,Pattern Template Method
Consente alle sottoclassi di ridefinire una parte di un metodo invece di riscriverlo interamente; puoi controllare quali operazioni devono ridefinire
java.util.Collections#sort()
java.io.InputStream#skip()
java.io.InputStream#read()
java.util.AbstractList#indexOf()
12,pattern Visitor
Fornisce un modo pratico e manutenibile per operare su un gruppo di oggetti. Consente di modificarne o estenderne il comportamento senza cambiare gli oggetti su cui si opera
javax.lang.model.element.Element e javax.lang.model.element.ElementVisitor
javax.lang.model.type.TypeMirror e javax.lang.model.type.TypeVisitor
Nota del traduttore: molti punti potrebbero essere controversi; stabilire se si tratti di un particolare pattern non è poi così importante: ciò che conta è che la loro progettazione possa offrirci indicazioni utili per migliorare il nostro codice