it-swarm.com.de

Beispiele für GoF-Entwurfsmuster in Java-Kernbibliotheken

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?

672
unj2

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.


Creational patterns

Abstract factory (erkennbar an den Erzeugungsmethoden, die die Fabrik selbst zurückschicken, wodurch wiederum ein anderer Abstrakt-/Schnittstellentyp erzeugt werden kann.)

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

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

Prototype (erkennbar an den Erstellungsmethoden, die eine different ​​-Instanz mit denselben Eigenschaften zurückgeben)

Singleton (erkennbar an den Erstellungsmethoden, die jedes Mal die same -Instanz (normalerweise von selbst) zurückgeben)


Strukturmuster

Adapter (erkennbar an den Erstellungsmethoden, die eine Instanz von different ​​abstract/interface type nehmen und eine Implementierung eines eigenen/eines anderen abstract/interface type zurückgeben, die decorates/overrides die angegebene Instanz)

Bridge (erkennbar an den Erstellungsmethoden, die eine Instanz von different ​​abstract/interface type nehmen und eine Implementierung eines eigenen abstract/interface type zurückgeben, die delegiert/verwendet ​​die angegebene Instanz)

  • Mir fällt noch 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 sing sie. Die Methoden Java.util.Collections#newSetFromMap() und singletonXXX() kommen jedoch sehr nahe.

Composite (erkennbar an Verhaltensmethoden, die eine Instanz von same abstract/interface type in eine Baumstruktur aufnehmen)

Decorator (erkennbar an Erstellungsmethoden, die eine Instanz von same abstract/interface type verwenden, die zusätzliches Verhalten hinzufügt)

Facade (erkennbar an Verhaltensmethoden, die intern Instanzen von different ​​independent abstract/interface types verwenden)

Flyweight (erkennbar an den Erstellungsmethoden, die eine zwischengespeicherte Instanz zurückgeben, ein bisschen die "Multiton" -Idee)

Proxy (Erkennbar durch Erstellungsmethoden, die eine Implementierung eines gegebenen Abstrakt-/Schnittstellentyps zurückgeben, der wiederum delegiert/verwendet ​​a nterschiedlich Implementierung eines gegebenen Abstrakt-/Schnittstellentyps)


Verhaltensmuster

Verantwortungskette (erkennbar an Verhaltensmethoden, die (indirekt) dieselbe Methode in einer anderen Implementierung von derselben abstract/interface-Typ in einer Warteschlange aufrufen)

Befehl (erkennbar an Verhaltensmethoden in einem Abstract/Interface-Typ, der eine Methode in einer Implementierung eines different ​​Abstract/Interface-Typs aufruft, der gekapselt ​​von der Befehlsimplementierung während seiner Erstellung erstellt wurde )

Interpreter (erkennbar an Verhaltensmethoden, die ein strukturell unterschiedliches Exemplar/Typ des angegebenen Exemplars/Typs zurückgeben. Beachten Sie, dass das Parsen/Formatieren nicht Teil des Musters ist. Bestimmen Sie das Muster und wenden Sie es an.)

Iterator (erkennbar an Verhaltensmethoden, die nacheinander Instanzen eines different ​​-Typs aus einer Warteschlange zurückgeben.)

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

Memento (erkennbar an Verhaltensmethoden, die intern den Zustand der whole -Instanz ändern)

Observer (oder Publish/Subscribe) (erkennbar an Verhaltensmethoden, die eine Methode auf einer Instanz von another abstract/interface type aufrufen, abhängig vom eigenen Zustand)

State (Erkennbar durch Verhaltensmethoden, die ihr Verhalten in Abhängigkeit vom Zustand der Instanz ändern, der extern gesteuert werden kann.)

Strategie (erkennbar an Verhaltensmethoden in einem Abstract/Interface-Typ, der eine Methode in einer Implementierung eines different ​​Abstract/Interface-Typs aufruft, der übergeben als Methodenargument in den Strategieumsetzung)

Template Methode (erkennbar an Verhaltensmethoden, die bereits ein durch einen abstrakten Typ definiertes "Standard" -Verhalten haben)

Visitor (erkennbar an zwei different ​​abstract/interface-Typen, für die Methoden definiert sind, die jeweils den other abstract/interface-Typ annehmen; der eine ruft tatsächlich die Methode des anderen auf und der andere führt sie aus die gewünschte Strategie drauf)

3101
BalusC
  1. Beobachtermuster während des gesamten Schwungs (Observable, Observer)
  2. MVC auch in Schwung
  3. Adaptermuster: InputStreamReader und OutputStreamWriter HINWEIS: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapter sind nicht Adapter; Sie sind eigentlich Nullobjekte. Schlechte Namensauswahl von Sun.
  4. Dekorationsmuster (BufferedInputStream kann andere Streams wie FilterInputStream dekorieren)
  5. AbstractFactory Pattern für das AWT Toolkit und die steckbaren Look-and-Feel-Klassen von Swing
  6. Java.lang.Runtime#getRuntime() ist Singleton
  7. ButtonGroup für Mediator-Muster
  8. Action, AbstractAction können für verschiedene visuelle Darstellungen verwendet werden, um denselben Code auszuführen -> Befehlsmuster
  9. Internierte Zeichenfolgen oder CellRender in JTable für Flyweight-Muster
  10. Das Ereignismodell Java 1.0 ist ebenso wie Servlet-Filter ein Beispiel für die Verantwortungskette.
  11. Iteratormuster im Collections Framework
  12. Verschachtelte Container in AWT/Swing verwenden das Composite-Muster
  13. Layout Manager in AWT/Swing sind ein Beispiel für Strategie

und viele mehr, denke ich

103
jitter
  1. Fliegengewicht wird mit einigen Werten von Byte, Short, Integer, Long und String verwendet.
  2. Fassade wird an vielen Stellen verwendet, aber das offensichtlichste sind Scripting-Schnittstellen.
  3. Singleton - Java.lang.Runtime fällt mir ein.
  4. Abstrakte Fabrik - Auch Scripting und JDBC API.
  5. Befehl - Rückgängig/Wiederherstellen von TextComponent.
  6. Dolmetscher - RegEx (Java.util.regex .) und SQL (Java.sql.) API.
  7. Prototyp - Nicht 100% sicher, ob diese Anzahl, aber ich denke, clone() Methode kann für diesen Zweck verwendet werden.
49
NawaMan

RMI basiert auf Proxy.

Sollte es möglich sein, eines der 23 Muster in GoF zu zitieren:

  1. Abstract Factory: Java.sql-Schnittstellen erhalten alle ihre konkreten Implementierungen von JDBC JAR, wenn der Treiber registriert ist.
  2. Generator: 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: Auflistungsklassen in Java.util. Liste implementiert von ArrayList.
  8. Zusammengesetzt: Java.awt. Java.awt.Component + Java.awt.Container
  9. Decorator: Überall im Java.io-Paket.
  10. Fassade: ExternalContext verhält sich wie eine Fassade zum Durchführen von Cookies, Sitzungsbereichen und ähnlichen Vorgängen.
  11. Fliegengewicht: Integer, Character, etc.
  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. Vermittler: JMS?
  18. Erinnerung:
  19. Observer: 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 edit da.

40
duffymo

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.

26
uckelman

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.

21
Esko

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.

  • Abstrakte Fabrik

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).

20
Catweazle