J'apprends GoF Java Design Patterns et je veux en voir des exemples réels. Quels sont de bons exemples de ces modèles de conception dans les bibliothèques principales de Java?
672
J'apprends GoF Java Design Patterns et je veux en voir des exemples réels. Quels sont de 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 les modèles mentionnés par le GoF. Je vais les résumer ici et essayer d'attribuer autant d'implémentations de modèles que possible, trouvées 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()
(aussi 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)
(Renvoie un objet singleton par protocole)java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller()
et d'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)
(renvoie a Reader
)java.io.OutputStreamWriter(OutputStream)
(renvoie a 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 les utilise . Les java.util.Collections#newSetFromMap()
et singletonXXX()
méthodes vient cependant à proximité.java.awt.Container#add(Component)
(pratiquement partout Swing ainsi)javax.faces.component.UIComponent#getChildren()
(pratiquement partout dans l'interface utilisateur JSF donc)java.io.InputStream
, OutputStream
, Reader
et Writer
ont un constructeur de prendre une instance de même type.java.util.Collections
, Les checkedXXX()
, synchronizedXXX()
et les unmodifiableXXX()
méthodes.javax.servlet.http.HttpServletRequestWrapper
et HttpServletResponseWrapper
javax.swing.JScrollPane
javax.faces.context.FacesContext
, Il utilise en interne entre autres les types d'interface abstrait / LifeCycle
, ViewHandler
, NavigationHandler
et bien d' autres sans que l'utilisateur final doit inquiéter à ce sujet (qui sont cependant par injection dérogation possible ).javax.faces.context.ExternalContext
, Qui utilise en interne ServletContext
, HttpSession
, HttpServletRequest
, HttpServletResponse
, etc.java.lang.Integer#valueOf(int)
(aussi 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 entre autres aussi java.util.Scanner
!).java.util.Enumeration
java.util.Timer
(toutes les scheduleXXX()
méthodes)java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService
(les invokeXXX()
et submit()
méthodes)java.util.concurrent.ScheduledExecutorService
(toutes les scheduleXXX()
méthodes)java.lang.reflect.Method#invoke()
java.util.Date
(les méthodes setter font cela, Date
est représenté en interne par une long
valeur)java.io.Serializable
javax.faces.component.StateHolder
java.util.Observer
/ java.util.Observable
(rarement utilisé dans le monde réel cependant)java.util.EventListener
(pratiquement partout 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 (état) actuelle du cycle de vie JSF)java.util.Comparator#compare()
, exécuté par entre autres Collections#sort()
.javax.servlet.http.HttpServlet
, la service()
et toutes les doXXX()
méthodes prennent HttpServletRequest
et HttpServletResponse
l'implémenteur doit les traiter (et non les saisir comme 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 doXXX()
méthodes envoient par défaut une erreur HTTP 405 "Méthode non autorisée" à la réponse. Vous êtes libre d'implémenter aucun ou aucun d'entre eux.
javax.lang.model.element
définit les visiteurs;) Je ne sais pas trop sidoXXX
etdoFilter
sont des "stratégies".Observable
,Observer
)ContainerAdapter
,ComponentAdapter
,FocusAdapter
,KeyAdapter
,MouseAdapter
sont pas des adaptateurs; ce sont en fait des objets nuls. Mauvais choix de nom par Sun.BufferedInputStream
peut décorer d'autres flux tels queFilterInputStream
)java.lang.Runtime#getRuntime()
est SingletonButtonGroup
pour motif MediatorAction
,AbstractAction
peut être utilisé pour différentes représentations visuelles pour exécuter le même code -> Modèle de commandeet bien d'autres je suppose
la source
clone()
méthode peut être utilisée à cette fin.la source
java.awt
etjava.swing
packages. En effet, ils partagent des attributs intrinsèques presque identiques et les attributs extrinsèques sont des composants d'interface utilisateur différents qu'ils présentent sous forme d'interface utilisateur.RMI est basé sur Proxy.
Il devrait être possible d'en citer un pour la plupart des 23 modèles du GoF:
Je ne peux pas penser à des exemples en Java pour 10 sur 23, mais je vais voir si je peux faire mieux demain. C'est à ça que sert l'édition.
la source
Le motif Abstract Factory est utilisé à divers endroits. Par exemple,
DatagramSocketImplFactory
,PreferencesFactory
. Il y en a beaucoup plus --- recherchez dans Javadoc des interfaces qui ont le mot "Factory" dans leur nom.Il existe également de nombreuses instances du modèle Factory.
la source
Même si je suis en quelque sorte une horloge cassée avec celle-ci, l'API Java XML utilise beaucoup Factory. Je veux juste dire ceci:
...et ainsi de suite.
De plus, divers tampons (StringBuffer, ByteBuffer, StringBuilder) utilisent Builder.
la source
java.util.Collection # Iterator est un bon exemple de méthode d'usine. En fonction de la sous-classe concrète de Collection que vous utilisez, elle créera une implémentation Iterator. Parce que la superclasse Factory (Collection) et l'itérateur créé sont des interfaces, il est parfois confondu avec AbstractFactory. La plupart des exemples pour 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 d'usine est réduite et l'usine utilise d'autres moyens pour choisir le produit à retourner.
Une usine abstraite a plusieurs méthodes d'usine, chacune créant un produit différent. Les produits fabriqués par une seule usine sont destinés à être utilisés ensemble (il est préférable que votre imprimante et vos cartouches proviennent de la même usine (abstraite)). Comme mentionné dans les réponses ci-dessus, les familles de composants AWT GUI, différentes d'une plateforme à l'autre, en sont un exemple (bien que sa mise en œuvre diffère de la structure décrite dans Gof).
la source