I, Strukturmuster
1,Adaptermuster
Dient dazu, eine Schnittstelle in eine andere umzuwandeln
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,Brückenmuster
Dieses Muster entkoppelt die Abstraktion von der Implementierung ihrer Operationen, sodass sich Abstraktion und Implementierung unabhängig voneinander verändern können
AWT (Es stellt eine Abstraktionsschicht bereit, welche die Fensterunterstützung auf das native Betriebssystem abbildet.)
JDBC
3,Kompositum-Muster
sodass einzelne Objekte und Zusammensetzungen von Objekten aus Sicht des Clients gleichbehandelt werden. Anders gesagt: Eine Methode eines bestimmten Typs akzeptiert zugleich auch ihren eigenen Typ als Parameter
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,Dekorierer-Muster
Einem Objekt dynamisch zusätzliche Funktionen hinzuzufügen, ist auch eine Alternative zur Unterklassenbildung. Wie man sieht, wird beim Erstellen einer Instanz eines Typs zugleich ein Objekt desselben Typs übergeben. Dies begegnet einem überall im JDK; Sie werden feststellen, dass es allgegenwärtig ist. Die folgende Liste enthält daher nur einen kleinen Ausschnitt
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,Fassadenmuster
Eine einfache Schnittstelle für eine Gruppe von Komponenten, Schnittstellen, Abstraktionen oder Subsystemen bereitstellen
java.lang.Class
javax.faces.webapp.FacesServlet
6,Fliegengewicht-Muster
Einen Cache verwenden, um die Zugriffszeit auf zahlreiche kleine Objekte zu verkürzen
java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
7,Proxy-Muster
Beim Proxy-Muster wird ein einfaches Objekt als Stellvertreter für ein komplexes Objekt oder ein Objekt verwendet, dessen Erstellung zeitaufwendig ist.
java.lang.reflect.Proxy
RMI

Zwei, Erzeugungsmuster
1, Abstrakte-Fabrik-Muster
Das abstrakte Fabrikmuster stellt ein Protokoll bereit, um eine Reihe zusammengehöriger oder unabhängiger Objekte zu erzeugen, ohne deren konkrete Typen anzugeben. Es ermöglicht, die Anwendung von der konkreten Implementierung des verwendeten Frameworks zu entkoppeln. Dies ist im JDK und in vielen Frameworks wie Spring überall anzutreffen. Solche Muster lassen sich auch leicht erkennen: Eine Methode erzeugt ein neues Objekt, gibt aber ein Interface oder eine abstrakte Klasse zurück – dann handelt es sich um das abstrakte Fabrikmuster
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, Erbauermuster (Builder)
Definiert eine neue Klasse zur Erstellung von Instanzen einer anderen Klasse, um die Erzeugung komplexer Objekte zu vereinfachen. Das Builder-Muster verwendet üblicherweise auch Methodenverkettung zur Umsetzung
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
javax.swing.GroupLayout.Group#addComponent()
3,Fabrikmethode
ist einfach eine Methode, die ein konkretes Objekt zurückgibt
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,Prototyp-Muster
Ermöglicht es Instanzen einer Klasse, Kopien ihrer selbst zu erzeugen. Wenn das Erstellen einer Objektinstanz sehr komplex und zeitaufwendig ist, kann dieses Muster verwendet werden. Anstatt eine neue Instanz zu erstellen, können Sie ein Objekt kopieren und direkt verändern
java.lang.Object#clone()
java.lang.Cloneable
5,Singleton-Muster
Dient dazu, sicherzustellen, dass eine Klasse nur eine Instanz besitzt. Joshua Bloch empfiehlt in Effetive Java eine weitere Methode: die Verwendung eines Enums
java.lang.Runtime#getRuntime()
java.awt.Toolkit#getDefaultToolkit()
java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
java.awt.Desktop#getDesktop()
III,Verhaltensmuster
1,Zuständigkeitsketten-Muster
Die Anfrage wird von einem Objekt an das nächste Objekt in der Kette weitergegeben, bis sie vollständig verarbeitet ist. Dadurch werden die Objekte voneinander entkoppelt
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
2,Befehlsmodus
Operationen in einem Objekt kapseln, damit sie gespeichert, übergeben und zurückgegeben werden können
java.lang.Runnable
javax.swing.Action
3,Interpreter-Muster
Dieses Muster definiert üblicherweise die Grammatik einer Sprache und analysiert anschließend Anweisungen, die dieser Grammatik entsprechen
java.util.Pattern
java.text.Normalizer
java.text.Format
4, Iteratormuster
Bietet eine einheitliche Methode, um die Objekte einer Collection der Reihe nach zu durchlaufen, unabhängig von der konkreten Implementierung der zugrunde liegenden Collection
java.util.Iterator
java.util.Enumeration
5,Mediator-Muster
Nachrichten über ein zwischengeschaltetes Objekt verteilen und dadurch direkte Abhängigkeiten zwischen Klassen reduzieren
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()
6,Memento-Muster
Erstellt eine Momentaufnahme des Objektzustands, damit das Objekt seinen ursprünglichen Zustand wiederherstellen kann, ohne seinen Inhalt offenzulegen. Das Date-Objekt implementiert das Memento-Muster mithilfe eines internen long-Werts
java.util.Date
java.io.Serializable
7,Nullobjekt-Muster
Dieses Muster ersetzt den Zustand, in dem kein Objekt vorhanden ist, durch ein bedeutungsloses Objekt. Dadurch müssen Sie leere Objekte nicht zusätzlich behandeln
java.util.Collections#emptyList()
java.util.Collections#emptyMap()
java.util.Collections#emptySet()
8,Beobachtermuster
Es ermöglicht einem Objekt, Nachrichten flexibel an interessierte Objekte zu senden
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
9,Zustandsmuster
Durch die Änderung des inneren Zustands eines Objekts lässt sich dessen Verhalten zur Laufzeit dynamisch ändern
java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()
10,Strategiemuster
Mit diesem Muster lässt sich eine Gruppe von Algorithmen als eine Reihe von Objekten kapseln. Durch die Übergabe dieser Objekte kann die Funktionalität des Programms flexibel verändert werden
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
11, Schablonenmethodenmuster
Ermöglicht Unterklassen, einen Teil einer Methode zu überschreiben, statt sie vollständig neu zu implementieren. Du kannst steuern, welche Operationen die Unterklassen überschreiben müssen
java.util.Collections#sort()
java.io.InputStream#skip()
java.io.InputStream#read()
java.util.AbstractList#indexOf()
12,Besuchermuster
Bietet eine bequeme und wartbare Möglichkeit, eine Gruppe von Objekten zu bearbeiten. Damit lässt sich das Verhalten von Objekten ändern oder erweitern, ohne die bearbeiteten Objekte zu verändern
javax.lang.model.element.Element und javax.lang.model.element.ElementVisitor
javax.lang.model.type.TypeMirror und javax.lang.model.type.TypeVisitor
Anmerkung des Übersetzers: Vieles dürfte umstritten sein. Ob es sich tatsächlich um ein bestimmtes Entwurfsmuster handelt, ist nicht besonders wichtig. Entscheidend ist, dass uns diese Entwürfe Erfahrungen vermitteln können, mit denen wir unseren Code verbessern.