J'apprends le GoF Java Design Patterns et je souhaite en voir des exemples concrets. Quels sont quelques bons exemples de ces modèles de conception dans les bibliothèques principales de Java?
Vous pouvez trouver un aperçu de nombreux modèles de conception dans Wikipedia . Il mentionne également quels modèles sont mentionnés par le GoF. Je vais les résumer ici et essayer d’affecter autant d’implémentations de modèles que possible, que ce soit dans les API Java SE et Java EE.
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
Java.lang.StringBuilder#append()
(non synchronisé)Java.lang.StringBuffer#append()
(synchronisé)Java.nio.ByteBuffer#put()
(également sur CharBuffer
, ShortBuffer
, IntBuffer
, LongBuffer
, FloatBuffer
et 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)
(Retourne un objet singleton par protocole)Java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller()
et autres méthodes similairesJava.lang.Object#clone()
(la classe doit implémenter Java.lang.Cloneable
)Java.util.Arrays#asList()
Java.util.Collections#list()
Java.util.Collections#enumeration()
Java.io.InputStreamReader(InputStream)
(retourne un Reader
)Java.io.OutputStreamWriter(OutputStream)
(retourne un Writer
)javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
et #unmarshal()
new LinkedHashMap(LinkedHashSet<K>, List<V>)
qui retourne une carte liée non modifiable qui ne clone pas les éléments, mais utilise eux. Les méthodes Java.util.Collections#newSetFromMap()
et singletonXXX()
se rapprochent toutefois.Java.awt.Container#add(Component)
(pratiquement sur tout le Swing donc)javax.faces.component.UIComponent#getChildren()
(pratiquement sur toute l'interface utilisateur JSF)Java.io.InputStream
, OutputStream
, Reader
et Writer
avoir un constructeur prenant une instance du même type.Java.util.Collections
, le checkedXXX()
, synchronizedXXX()
et unmodifiableXXX()
méthodes.javax.servlet.http.HttpServletRequestWrapper
et HttpServletResponseWrapper
javax.swing.JScrollPane
javax.faces.context.FacesContext
, il utilise en interne, entre autres, les types abstrait/interface LifeCycle
, ViewHandler
, NavigationHandler
et bien d’autres encore sans que l’utilisateur final ait à s’en soucier (qui sont toutefois écrasables par injection).javax.faces.context.ExternalContext
, qui utilise en interne ServletContext
, HttpSession
, HttpServletRequest
, HttpServletResponse
, etc.Java.lang.Integer#valueOf(int)
(également sur Boolean
, Byte
, Character
, Short
, Long
et BigDecimal
)Java.lang.reflect.Proxy
Java.rmi.*
javax.ejb.EJB
( explication ici )javax.inject.Inject
( explication ici )javax.persistence.PersistenceContext
Java.lang.Runnable
javax.swing.Action
Java.util.Pattern
Java.text.Normalizer
Java.text.Format
javax.el.ELResolver
Java.util.Iterator
(donc parmi d'autres également Java.util.Scanner
!).Java.util.Enumeration
Java.util.Timer
(toutes les méthodes scheduleXXX()
)Java.util.concurrent.Executor#execute()
Java.util.concurrent.ExecutorService
(les méthodes invokeXXX()
et submit()
)Java.util.concurrent.ScheduledExecutorService
(toutes les méthodes scheduleXXX()
)Java.lang.reflect.Method#invoke()
Java.util.Date
(les méthodes de définition le font, Date
est représenté en interne par une valeur long
)Java.io.Serializable
javax.faces.component.StateHolder
Java.util.Observer
/ Java.util.Observable
(rarement utilisé dans le monde réel)Java.util.EventListener
(pratiquement sur tout le Swing donc)javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
javax.faces.lifecycle.LifeCycle#execute()
(contrôlé par FacesServlet
, le comportement dépend de la phase actuelle (état) du cycle de vie de JSF)Java.util.Comparator#compare()
, exécuté entre autres Collections#sort()
.javax.servlet.http.HttpServlet
, les méthodes service()
et toutes les méthodes doXXX()
prennent HttpServletRequest
et HttpServletResponse
et le réalisateur doit les traiter (et ne pas les obtenir en tant que variables d'instance!).javax.servlet.Filter#doFilter()
Java.io.InputStream
, Java.io.OutputStream
, Java.io.Reader
et Java.io.Writer
.Java.util.AbstractList
, Java.util.AbstractSet
et Java.util.AbstractMap
.javax.servlet.http.HttpServlet
, toutes les méthodes doXXX()
envoie par défaut une erreur HTTP 405 "Méthode non autorisée" à la réponse. Vous êtes libre de n'en implémenter aucune ou aucune.Observable
, Observer
)ContainerAdapter
, ComponentAdapter
, FocusAdapter
, KeyAdapter
, MouseAdapter
sont non adaptateurs; ce sont en fait des objets nuls. Mauvais choix de nommage par Sun.BufferedInputStream
peut décorer d'autres flux tels que FilterInputStream
)Java.lang.Runtime#getRuntime()
est SingletonButtonGroup
pour le motif MediatorAction
, AbstractAction
peut être utilisé pour différentes représentations visuelles afin d'exécuter le même code -> Modèle de commandeet beaucoup plus je suppose
clone()
peut être utilisée à cette fin.RMI est basé sur le proxy.
Il devrait être possible d'en citer un pour la plupart des 23 modèles de GoF:
Je ne peux pas penser aux exemples de Java pour 10 des 23, mais je verrai si je peux faire mieux demain. C'est à quoi sert l'édition.
Le motif Abstract Factory est utilisé à divers endroits. Par exemple, DatagramSocketImplFactory
, PreferencesFactory
. Il en existe beaucoup d'autres --- recherchez dans le Javadoc des interfaces portant le mot "Factory" dans leur nom.
En outre, il existe également quelques exemples du motif Factory.
Bien que je sois en quelque sorte une horloge cassée avec celle-ci, Java API XML utilise beaucoup Factory. Je veux dire juste regarder ceci:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
...et ainsi de suite.
De plus, divers tampons (StringBuffer, ByteBuffer, StringBuilder) utilisent Builder.
Java.util.Collection # Iterator est un bon exemple de méthode Factory. En fonction de la sous-classe concrète de Collection que vous utilisez, cela créera une implémentation d'Iterator. Étant donné que la superclasse Factory (Collection) et l'Iterator créés sont des interfaces, il est parfois confondu avec AbstractFactory. La plupart des exemples de AbstractFactory dans la réponse acceptée (BalusC) sont des exemples de Factory , une version simplifiée de Factory Method, qui ne fait pas partie des modèles GoF d'origine. Dans Facory, la hiérarchie des classes fabrique est réduite et la fabrique utilise d'autres moyens pour choisir le produit à retourner.
Une fabrique abstraite dispose de plusieurs méthodes, chacune créant un produit différent. Les produits fabriqués par une usine sont destinés à être utilisés ensemble (votre imprimante et vos cartouches doivent provenir de la même usine (abstraite)). Comme mentionné dans les réponses ci-dessus, les familles de composants d'interface graphique AWT, qui diffèrent d'une plate-forme à l'autre, en sont un exemple (bien que sa mise en œuvre diffère de la structure décrite dans Gof).