Ich lerne GoF Java Design Patterns und möchte einige Beispiele aus der Praxis sehen. Was sind einige gute Beispiele für diese Entwurfsmuster in Javas Kernbibliotheken?
Eine Übersicht über viele Designmuster finden Sie in Wikipedia . Es wird auch erwähnt, welche Muster von der GoF erwähnt werden. Ich fasse sie hier zusammen und versuche, so viele Musterimplementierungen wie möglich zuzuweisen, die sowohl in den Java SE- als auch in den Java EE-APIs enthalten sind.
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
Java.lang.StringBuilder#append()
(nicht synchronisiert)Java.lang.StringBuffer#append()
(synchronisiert)Java.nio.ByteBuffer#put()
(auch am CharBuffer
, ShortBuffer
, IntBuffer
, LongBuffer
, FloatBuffer
und 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)
(Gibt ein einzelnes Objekt pro Protokoll zurück)Java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller()
und andere ähnliche MethodenJava.lang.Object#clone()
(die Klasse muss implementieren Java.lang.Cloneable
)Java.util.Arrays#asList()
Java.util.Collections#list()
Java.util.Collections#enumeration()
Java.io.InputStreamReader(InputStream)
(gibt ein Reader
zurück)Java.io.OutputStreamWriter(OutputStream)
(gibt ein Writer
zurück)javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
und #unmarshal()
new LinkedHashMap(LinkedHashSet<K>, List<V>)
, das eine nicht modifizierbare verknüpfte Karte zurückgibt, die die Elemente nicht klont, sondern sing sie. Die Methoden Java.util.Collections#newSetFromMap()
und singletonXXX()
kommen jedoch sehr nahe.Java.awt.Container#add(Component)
(praktisch alles über Swing also)javax.faces.component.UIComponent#getChildren()
(praktisch auf der gesamten JSF-Benutzeroberfläche)Java.io.InputStream
, OutputStream
, Reader
und Writer
einen Konstruktor haben, der eine Instanz des gleichen Typs verwendet.Java.util.Collections
, das checkedXXX()
, synchronizedXXX()
und unmodifiableXXX()
Methoden.javax.servlet.http.HttpServletRequestWrapper
und HttpServletResponseWrapper
javax.swing.JScrollPane
javax.faces.context.FacesContext
, verwendet intern unter anderem die Typen abstract/interface LifeCycle
, ViewHandler
, NavigationHandler
und vieles mehr, ohne dass sich der Endverbraucher darum kümmern muss (die jedoch durch Injektion überschrieben werden können).javax.faces.context.ExternalContext
, das intern ServletContext
, HttpSession
, HttpServletRequest
, HttpServletResponse
, etc.Java.lang.Integer#valueOf(int)
(auch am Boolean
, Byte
, Character
, Short
, Long
und BigDecimal
)Java.lang.reflect.Proxy
Java.rmi.*
javax.ejb.EJB
( Erklärung hier )javax.inject.Inject
( Erklärung hier )javax.persistence.PersistenceContext
Java.lang.Runnable
javax.swing.Action
Java.util.Pattern
Java.text.Normalizer
Java.text.Format
javax.el.ELResolver
Java.util.Iterator
(also unter anderem auch Java.util.Scanner
!).Java.util.Enumeration
Java.util.Timer
(alle scheduleXXX()
-Methoden)Java.util.concurrent.Executor#execute()
Java.util.concurrent.ExecutorService
(die Methoden invokeXXX()
und submit()
)Java.util.concurrent.ScheduledExecutorService
(alle scheduleXXX()
-Methoden)Java.lang.reflect.Method#invoke()
Java.util.Date
(die Setter-Methoden machen das, Date
wird intern durch einen long
-Wert dargestellt)Java.io.Serializable
javax.faces.component.StateHolder
Java.util.Observer
/ Java.util.Observable
(in der realen Welt jedoch selten verwendet)Java.util.EventListener
(praktisch alles über Swing also)javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
javax.faces.lifecycle.LifeCycle#execute()
(gesteuert von FacesServlet
, das Verhalten ist abhängig von der aktuellen Phase (Status) des JSF-Lebenszyklus.)Java.util.Comparator#compare()
, ausgeführt unter anderem von Collections#sort()
.javax.servlet.http.HttpServlet
, die Methoden service()
und alle doXXX()
nehmen HttpServletRequest
und HttpServletResponse
und der Implementierer muss sie verarbeiten (und darf sie nicht als Instanzvariablen erhalten!).javax.servlet.Filter#doFilter()
Java.io.InputStream
, Java.io.OutputStream
, Java.io.Reader
und Java.io.Writer
.Java.util.AbstractList
, Java.util.AbstractSet
und Java.util.AbstractMap
.javax.servlet.http.HttpServlet
, alle doXXX()
-Methoden senden standardmäßig einen HTTP 405-Fehler "Methode nicht zulässig" an die Antwort. Es steht Ihnen frei, keine oder eine davon zu implementieren.Observable
, Observer
)ContainerAdapter
, ComponentAdapter
, FocusAdapter
, KeyAdapter
, MouseAdapter
sind nicht Adapter; Sie sind eigentlich Nullobjekte. Schlechte Namensauswahl von Sun.BufferedInputStream
kann andere Streams wie FilterInputStream
dekorieren)Java.lang.Runtime#getRuntime()
ist SingletonButtonGroup
für Mediator-MusterAction
, AbstractAction
können für verschiedene visuelle Darstellungen verwendet werden, um denselben Code auszuführen -> Befehlsmusterund viele mehr, denke ich
clone()
Methode kann für diesen Zweck verwendet werden.RMI basiert auf Proxy.
Sollte es möglich sein, eines der 23 Muster in GoF zu zitieren:
Ich kann mir keine Beispiele in Java für 10 von 23 vorstellen, aber ich werde sehen, ob ich es morgen besser machen kann. Dafür ist edit da.
Das Abstract Factory-Muster wird an verschiedenen Stellen verwendet. Zum Beispiel DatagramSocketImplFactory
, PreferencesFactory
. Es gibt noch viele andere - durchsuchen Sie das Javadoc nach Schnittstellen, deren Name das Wort "Factory" enthält.
Es gibt auch eine ganze Reihe von Instanzen des Factory-Musters.
Obwohl ich mit dieser eine Art kaputte Uhr habe, verwendet die XML-API Java Factory sehr oft. Ich meine, sieh dir das an:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
...und so weiter und so fort.
Zusätzlich verwenden verschiedene Puffer (StringBuffer, ByteBuffer, StringBuilder) Builder.
Java.util.Collection # Iterator ist ein gutes Beispiel für eine Factory-Methode. Abhängig von der konkreten Unterklasse von Collection, die Sie verwenden, wird eine Iterator-Implementierung erstellt. Da sowohl die Factory-Superklasse (Collection) als auch der erstellte Iterator Schnittstellen sind, wird dies manchmal mit AbstractFactory verwechselt. Die meisten Beispiele für AbstractFactory in der akzeptierten Antwort (BalusC) sind Beispiele für Factory , eine vereinfachte Version der Factory-Methode, die nicht Teil der ursprünglichen GoF-Muster ist. In Facory wird die Factory-Klassenhierarchie reduziert und die Factory verwendet andere Mittel, um das zurückzugebende Produkt auszuwählen.
Eine abstrakte Fabrik hat mehrere Fabrikmethoden, von denen jede ein anderes Produkt erzeugt. Die von einer Fabrik produzierten Produkte sollen zusammen verwendet werden (Drucker und Patronen sollten aus derselben (abstrakten) Fabrik stammen). Wie in den obigen Antworten erwähnt, sind die von Plattform zu Plattform unterschiedlichen AWT-GUI-Komponenten ein Beispiel dafür (obwohl sich die Implementierung von der in Gof beschriebenen Struktur unterscheidet).