I,Patrons de conception structurels
1,patron Adaptateur
Sert à convertir une interface en une autre
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,Patron de conception Pont
Ce patron découple l’abstraction de l’implémentation de ses opérations, afin que l’abstraction et l’implémentation puissent évoluer indépendamment
AWT (Il fournit une couche d’abstraction qui s’appuie sur le système d’exploitation natif pour la gestion des fenêtres.)
JDBC
3,patron Composite
permet au client de traiter de la même manière un objet individuel et une composition d’objets. Autrement dit, une méthode d’un type donné accepte également des paramètres de ce même type
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,Patron Décorateur
Ajoute dynamiquement des fonctionnalités supplémentaires à un objet, ce qui constitue aussi une alternative au sous-classement. On constate que, lorsqu’on crée un objet d’un type donné, on lui transmet également un objet du même type. Ce procédé est omniprésent dans le JDK ; la liste ci-dessous n’en présente donc qu’une petite partie
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,patron Façade
Fournir une interface simple à un ensemble de composants, d’interfaces, d’abstractions ou de sous-systèmes
java.lang.Class
javax.faces.webapp.FacesServlet
6,patron Poids mouche
Utiliser le cache pour accélérer l’accès à un grand nombre de petits objets
java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
7,patron Proxy
Le patron Proxy consiste à utiliser un objet simple à la place d’un objet complexe ou long à créer.
java.lang.reflect.Proxy
RMI

II,Patrons de création
1,patron de conception Fabrique abstraite
Le patron de conception Fabrique abstraite fournit un protocole permettant de créer une série d’objets liés ou indépendants sans préciser leurs types concrets. Il permet de découpler une application de l’implémentation concrète du framework utilisé. On le retrouve partout dans le JDK ou dans de nombreux frameworks comme Spring. Ces patrons sont également faciles à reconnaître : une méthode qui crée un nouvel objet mais renvoie une interface ou une classe abstraite relève du patron Fabrique abstraite
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,patron Monteur (Builder)
Définit une nouvelle classe pour construire les instances d’une autre classe afin de simplifier la création d’objets complexes. Le patron de conception Monteur utilise aussi généralement le chaînage de méthodes pour sa mise en œuvre
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
javax.swing.GroupLayout.Group#addComponent()
3,méthode fabrique
C’est une méthode qui renvoie un objet concret
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,patron Prototype
Permet aux instances d’une classe de générer leur propre copie. Lorsque la création d’une instance est très complexe et prend beaucoup de temps, ce modèle permet de copier un objet et de le modifier directement, au lieu de créer une nouvelle instance
java.lang.Object#clone()
java.lang.Cloneable
5,Patron Singleton
Sert à garantir qu’une classe ne possède qu’une seule instance. Dans Effetive Java, Joshua Bloch recommande une autre méthode : utiliser une énumération
java.lang.Runtime#getRuntime()
java.awt.Toolkit#getDefaultToolkit()
java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
java.awt.Desktop#getDesktop()
Trois,patrons comportementaux
1,patron de chaîne de responsabilité
Découpler les objets en transmettant la requête d’un objet au suivant dans la chaîne, jusqu’à ce qu’elle soit traitée
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
2,mode commande
Encapsuler les opérations dans un objet pour pouvoir les stocker, les transmettre et les renvoyer
java.lang.Runnable
javax.swing.Action
3,patron de conception Interpréteur
Ce patron définit généralement la grammaire d’un langage, puis analyse les énoncés conformes à cette grammaire
java.util.Pattern
java.text.Normalizer
java.text.Format
4,patron Itérateur
Fournir une méthode uniforme pour accéder séquentiellement aux objets d’une collection, indépendamment de son implémentation sous-jacente
java.util.Iterator
java.util.Enumeration
5,patron de conception Médiateur
En utilisant un objet intermédiaire pour distribuer les messages et réduire les dépendances directes entre les classes
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()
6,patron Mémento
Créer un instantané de l’état d’un objet afin de pouvoir rétablir son état initial sans exposer son contenu. L’objet Date met en œuvre le patron Mémento à l’aide d’une valeur long interne
java.util.Date
java.io.Serializable
7,patron Objet nul
Ce patron remplace l’absence d’objet par un objet sans signification particulière. Il évite ainsi d’avoir à prévoir un traitement supplémentaire pour les objets nuls
java.util.Collections#emptyList()
java.util.Collections#emptyMap()
java.util.Collections#emptySet()
8,Patron de conception Observateur
Il permet à un objet d’envoyer des messages avec souplesse aux objets intéressés
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
9,patron État
En modifiant l’état interne d’un objet, vous pouvez changer dynamiquement son comportement à l’exécution
java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()
10,patron Stratégie
Ce patron permet d’encapsuler un ensemble d’algorithmes dans une série d’objets. En passant ces objets en paramètres, on peut modifier avec souplesse les fonctionnalités du programme
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
11,Patron de la méthode gabarit
Permettre aux sous-classes de redéfinir une partie de la méthode au lieu de la réécrire entièrement ; vous pouvez déterminer quelles opérations elles doivent redéfinir
java.util.Collections#sort()
java.io.InputStream#skip()
java.io.InputStream#read()
java.util.AbstractList#indexOf()
12,patron Visiteur
Fournit un moyen pratique et facile à maintenir pour effectuer des opérations sur un ensemble d’objets. Il permet de modifier ou d’étendre le comportement des objets sans changer les objets sur lesquels portent les opérations
javax.lang.model.element.Element et javax.lang.model.element.ElementVisitor
javax.lang.model.type.TypeMirror et javax.lang.model.type.TypeVisitor
Note du traducteur : de nombreux points peuvent prêter à discussion. Qu’il s’agisse ou non d’un certain patron de conception n’est pas vraiment essentiel ; ce qui compte, ce sont les enseignements que leur conception peut nous apporter pour améliorer notre code