Beispiele für GoF-Entwurfsmuster in Javas Kernbibliotheken

672

Ich lerne GoF Java Design Patterns und möchte einige Beispiele aus dem wirklichen Leben sehen. Was sind einige gute Beispiele für diese Entwurfsmuster in den Kernbibliotheken von Java?

unj2
quelle

Antworten:

3229

Eine Übersicht über viele Designmuster finden Sie in Wikipedia . Es wird auch erwähnt, welche Muster von GoF erwähnt werden. Ich werde sie hier zusammenfassen und versuchen, so viele Musterimplementierungen wie möglich zuzuweisen, die sowohl in der Java SE- als auch in der Java EE-API enthalten sind.


Schöpfungsmuster

Abstrakte Fabrik (erkennbar an den Erstellungsmethoden, die die Fabrik selbst zurückgeben, die wiederum zum Erstellen eines anderen abstrakten / Schnittstellentyps verwendet werden kann)

Builder (erkennbar an Erstellungsmethoden, die die Instanz selbst zurückgeben)

Factory-Methode (erkennbar an Erstellungsmethoden, die eine Implementierung eines Abstract- / Interface-Typs zurückgeben)

Prototyp (erkennbar an Erstellungsmethoden, die eine andere Instanz von sich selbst mit denselben Eigenschaften zurückgeben)

Singleton (erkennbar an Erstellungsmethoden, die jedes Mal dieselbe Instanz (normalerweise von sich selbst) zurückgeben)


Strukturmuster

Adapter (erkennbar an Erstellungsmethoden, die eine Instanz eines anderen abstrakten / Schnittstellentyps verwenden und eine Implementierung eines eigenen / eines anderen abstrakten / Schnittstellentyps zurückgeben, der die angegebene Instanz dekoriert / überschreibt )

Bridge (erkennbar an Erstellungsmethoden, die eine Instanz eines anderen abstrakten / Schnittstellentyps verwenden und eine Implementierung eines eigenen abstrakten / Schnittstellentyps zurückgeben, der die angegebene Instanz delegiert / verwendet )

  • Noch fällt mir keiner ein. Ein fiktives Beispiel wäre, new LinkedHashMap(LinkedHashSet<K>, List<V>)das eine nicht modifizierbare verknüpfte Karte zurückgibt, die die Elemente nicht klont, sondern verwendet . Die java.util.Collections#newSetFromMap()und singletonXXX()Methoden kommen jedoch nahe.

Zusammengesetzt (erkennbar an Verhaltensmethoden, die eine Instanz desselben abstrakten / Schnittstellentyps in eine Baumstruktur aufnehmen)

Decorator (erkennbar an Erstellungsmethoden, die eine Instanz desselben abstrakten / Schnittstellentyps verwenden, wodurch zusätzliches Verhalten hinzugefügt wird)

Fassade (erkennbar an Verhaltensmethoden, bei denen intern Instanzen verschiedener unabhängiger abstrakter / Schnittstellentypen verwendet werden)

Fliegengewicht (erkennbar an kreativen Methoden, die eine zwischengespeicherte Instanz zurückgeben, ein bisschen die "Multiton" -Idee)

Proxy (erkennbar an Erstellungsmethoden, die eine Implementierung eines bestimmten Abstract- / Schnittstellentyps zurückgeben, die wiederum eine andere Implementierung eines bestimmten Abstract- / Schnittstellentyps delegiert / verwendet )


Verhaltensmuster

Verantwortungskette (erkennbar an Verhaltensmethoden, die (indirekt) dieselbe Methode in einer anderen Implementierung desselben Abstracts / Schnittstellentyps in einer Warteschlange aufrufen)

Befehl (erkennbar an Verhaltensmethoden in einem abstrakten / Schnittstellentyp, der eine Methode in einer Implementierung eines anderen abstrakten / Schnittstellentyps aufruft , der von der Befehlsimplementierung während ihrer Erstellung gekapselt wurde)

Interpreter (erkennbar an Verhaltensmethoden, die eine strukturell unterschiedliche Instanz / einen anderen strukturellen Typ der angegebenen Instanz / des angegebenen Typs zurückgeben; beachten Sie, dass das Parsen / Formatieren nicht Teil des Musters ist, das Muster bestimmt und wie es angewendet wird)

Iterator (erkennbar an Verhaltensmethoden, die nacheinander Instanzen eines anderen Typs aus einer Warteschlange zurückgeben)

Mediator (erkennbar an Verhaltensmethoden, die eine Instanz eines anderen abstrakten / Schnittstellentyps verwenden (normalerweise unter Verwendung des Befehlsmusters), die die angegebene Instanz delegiert / verwendet)

Memento (erkennbar an Verhaltensmethoden, die den Status der gesamten Instanz intern ändern )

Observer (oder Publish / Subscribe) (erkennbar an Verhaltensmethoden, die je nach Status eine Methode für eine Instanz eines anderen Abstract- / Schnittstellentyps aufrufen)

Zustand (recognizeable durch Verhaltens Methoden , die sein Verhalten auf der Instanz des Zustandes abhängig Änderungen , die von außen gesteuert werden kann)

Strategy (recognizeable durch Verhalten Methoden in einem abstrakten / Schnittstellentyp, der ein Verfahren in einer Implementierung eines ruft verschiedenen Abstract / Schnittstellentypen , das ist gebene in als Methode Argument in die Strategieumsetzung)

Vorlagenmethode (erkennbar an Verhaltensmethoden, bei denen bereits ein "Standard" -Verhalten durch einen abstrakten Typ definiert ist)

Besucher (erkennbar an zwei verschiedenen abstrakten / Schnittstellentypen, für die Methoden definiert sind, die jeweils den anderen abstrakten / Schnittstellentyp verwenden; der eine ruft tatsächlich die Methode des anderen auf und der andere führt die gewünschte Strategie darauf aus)

BalusC
quelle
23
beeindruckend .. :) +1. javax.lang.model.elementdefiniert Besucher;) Ich bin mir nicht ganz sicher, ob doXXXund doFiltersind "Strategien".
Bozho
16
Die genannten Builder, zB StrinbgBuilder, sind alle kein Beispiel für das Builder-Pattern. Es ist jedoch ein sehr häufiger Fehler, sie als Baumeister zu betrachten (Sie sind also nicht wirklich schuld ^ _ ^)
Angel O'Sphere
77
@ BalusC, ich habe eine Frage an dich. Haben Sie den GANZEN Quellcode von Java und JSF gelesen ?
Tapas Bose
20
@ Tapas: Ich habe nicht alles gelesen, nur Teile, die ich brauchte, oder war nur neugierig, wie "sie" es gemacht haben.
BalusC
7
Die meisten Beispiele unter "Factory-Methode" sind Beispiele für "statische Factory", bei der es sich nicht um ein GoF-Muster handelt. Nicht richtig.
Ringträger
107
  1. Beobachtermuster während des gesamten Schwungs ( Observable, Observer)
  2. MVC auch in Schwung
  3. Adapter Muster: Input und Output HINWEIS: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapterist nicht Adapter; Sie sind eigentlich Null-Objekte. Schlechte Namenswahl von Sun.
  4. Dekorierermuster ( BufferedInputStreamkönnen andere Ströme dekorieren wie FilterInputStream)
  5. AbstractFactory-Muster für das AWT Toolkit und die steckbaren Look-and-Feel-Klassen Swing
  6. java.lang.Runtime#getRuntime() ist Singleton
  7. ButtonGroup für Mediator-Muster
  8. Action, AbstractActionkann für verschiedene visuelle Darstellungen verwendet werden, um denselben Code auszuführen -> Befehlsmuster
  9. Internierte Zeichenfolgen oder CellRender in JTable für Flyweight-Muster (Denken Sie auch an verschiedene Pools - Thread-Pools, Verbindungspools, EJB-Objektpools - Bei Flyweight geht es wirklich um die Verwaltung gemeinsam genutzter Ressourcen.)
  10. Das Java 1.0-Ereignismodell ist ein Beispiel für die Verantwortungskette, ebenso wie Servlet-Filter.
  11. Iteratormuster im Collections Framework
  12. Verschachtelte Container in AWT / Swing verwenden das zusammengesetzte Muster
  13. Layout Manager in AWT / Swing sind ein Beispiel für Strategie

und viele mehr, denke ich

Jitter
quelle
1
Danke für den Tipp zu MouseAdapter. Ich fand diese Erklärung: stackoverflow.com/questions/9244185/…
Lincoln
Beachten Sie, dass Swing nur lose auf MVC basiert . View und Controller wurden zu einer Klasse zusammengefasst.
Matthias Braun
51
  1. Flyweight wird mit einigen Werten von Byte, Short, Integer, Long und String verwendet.
  2. Fassade wird an vielen Orten verwendet, aber das offensichtlichste sind Skriptschnittstellen.
  3. Singleton - java.lang.Runtime fällt mir ein.
  4. Abstract Factory - Auch Scripting und JDBC-API.
  5. Befehl - Rückgängig / Wiederherstellen von TextComponent.
  6. Interpreter - RegEx (java.util.regex. ) Und SQL (java.sql. ) API.
  7. Prototyp - Nicht 100% sicher, ob dies zählt, aber ich denke, dass die clone()Methode für diesen Zweck verwendet werden kann.
NawaMan
quelle
1
In Bezug auf das Fliegengewichtsmuster : Es können sich andere Layout-Manager java.awtals auch java.swingPakete befinden. In der Tat haben sie fast identische intrinsische Attribute und extrinsische Attribute sind verschiedene UI-Komponenten, die sie in UI-Form anordnen.
Vitaly
@NawaMan Sie sagten 5. Comand TextComponent rückgängig machen / wiederholen. Ich denke, es ist Andenken nicht Befehl. Oder höchstwahrscheinlich beides.
Stimpson Cat
Könnten Sie mir bitte bei einer verwandten Frage helfen - stackoverflow.com/questions/61284856/… . Ich habe das Befehlsmuster in diesem einfachen Beispiel verwendet, bin mir aber nicht sicher, ob es der richtige Weg ist, mein Problem zu lösen.
Tom Joe
42

RMI basiert auf Proxy.

Sollte möglich sein, eines für die meisten der 23 Muster in GoF zu zitieren:

  1. Abstract Factory: Alle java.sql-Schnittstellen erhalten ihre konkreten Implementierungen von JDBC JAR, wenn der Treiber registriert wird.
  2. Builder: java.lang.StringBuilder.
  3. Factory-Methode: Unter anderem XML-Fabriken.
  4. Prototyp: Vielleicht clone (), aber ich bin mir nicht sicher, ob ich das kaufe.
  5. Singleton: java.lang.System
  6. Adapter: Adapterklassen in java.awt.event, z. B. WindowAdapter.
  7. Bridge: Sammlungsklassen in java.util. Von ArrayList implementierte Liste.
  8. Zusammengesetzt: java.awt. java.awt.Component + java.awt.Container
  9. Dekorateur: Überall im java.io-Paket.
  10. Fassade: ExternalContext verhält sich wie eine Fassade zum Ausführen von Cookies, Sitzungsbereichen und ähnlichen Vorgängen.
  11. Fliegengewicht: Ganzzahl, Charakter usw.
  12. Proxy: java.rmi-Paket
  13. Verantwortungskette: Servlet-Filter
  14. Befehl: Menüpunkte schwingen
  15. Interpreter: Nein, direkt in JDK, aber JavaCC verwendet dies auf jeden Fall.
  16. Iterator: java.util.Iterator-Schnittstelle; kann nicht klarer sein.
  17. Mediator: JMS?
  18. Erinnerung:
  19. Beobachter: java.util.Observer/Observable (allerdings schlecht gemacht)
  20. Zustand:
  21. Strategie:
  22. Vorlage:
  23. Besucher:

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 Bearbeiten da.

Duffymo
quelle
28

Das Abstract Factory-Muster wird an verschiedenen Stellen verwendet. Zum Beispiel DatagramSocketImplFactory, PreferencesFactory. Es gibt noch viele weitere --- Durchsuchen Sie das Javadoc nach Schnittstellen, deren Name das Wort "Factory" enthält.

Es gibt auch einige Beispiele für das Factory-Muster.

uckelman
quelle
22

Obwohl ich mit dieser Uhr eine Art kaputte Uhr bin, verwendet die Java XML-API häufig Factory. Ich meine, schau 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.

Esko
quelle
21

java.util.Collection # Iterator ist ein gutes Beispiel für eine Factory-Methode. Abhängig von der konkreten Unterklasse der Sammlung, die Sie verwenden, wird eine Iterator-Implementierung erstellt. Da sowohl die Factory-Superklasse (Sammlung) als auch der erstellte Iterator Schnittstellen sind, wird sie 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.

  • Abstrakte Fabrik

Eine abstrakte Fabrik verfügt über mehrere Fabrikmethoden, die jeweils ein anderes Produkt erstellen. Die von einer Fabrik hergestellten Produkte sollen zusammen verwendet werden (Ihr Drucker und Ihre Patronen stammen besser aus derselben (abstrakten) Fabrik). Wie in den obigen Antworten erwähnt, sind die von Plattform zu Plattform unterschiedlichen Familien von AWT-GUI-Komponenten ein Beispiel dafür (obwohl sich ihre Implementierung von der in Gof beschriebenen Struktur unterscheidet).

Catweazle
quelle