Przykłady wzorców projektowych GoF w podstawowych bibliotekach Java

672

Uczę się wzorców projektowych Java GoF i chcę zobaczyć ich przykłady z życia. Jakie są dobre przykłady wzorców projektowych w podstawowych bibliotekach Java?

unj2
źródło

Odpowiedzi:

3229

Przegląd wielu wzorców projektowych można znaleźć w Wikipedii . Wspomina również, które wzory są wymienione przez GoF. Podsumuję je tutaj i spróbuję przypisać jak najwięcej implementacji wzorców, które można znaleźć zarówno w interfejsach API Java SE, jak i Java EE.


Wzory kreacyjne

Fabryka abstrakcyjna (rozpoznawalna za pomocą metod kreacji zwracających samą fabrykę, która z kolei może zostać wykorzystana do stworzenia innego typu abstrakcyjnego / interfejsu)

Builder (rozpoznawalny przez metody kreacyjne zwracające samą instancję)

Metoda fabryczna (rozpoznawalna przez metody kreacyjne zwracające implementację typu abstrakcyjnego / interfejsu)

Prototyp (rozpoznawalny za pomocą metod kreacyjnych zwracających inne wystąpienie o tych samych właściwościach)

Singleton (rozpoznawalny za pomocą metod kreacyjnych zwracających za każdym razem tę samą instancję (zwykle samą)


Wzory strukturalne

Adapter (rozpoznawalny przez metody kreacyjne biorąc instancję innego typu abstrakcyjnego / interfejsu i zwracając implementację własnego / innego typu abstrakcyjnego / interfejsu, który ozdabia / zastępuje daną instancję)

Bridge (rozpoznawalny przez metody kreacyjne pobierające instancję innego typu abstrakcyjnego / interfejsu i zwracające implementację własnego typu abstrakcyjnego / interfejsu, który deleguje / używa danej instancji)

  • Jeszcze nie przychodzi mi na myśl. Fikcyjnym przykładem może być new LinkedHashMap(LinkedHashSet<K>, List<V>)niemodyfikowana połączona mapa, która nie klonuje przedmiotów, ale używa ich. java.util.Collections#newSetFromMap()I singletonXXX()metody jednak zbliża.

Złożony (rozpoznawalny przez metody behawioralne uwzględniające instancję tego samego typu abstrakcyjnego / interfejsu w strukturze drzewa)

Dekorator (rozpoznawalny przez metody kreacyjne wykorzystujące instancję tego samego typu abstrakcyjnego / interfejsu, co dodaje dodatkowe zachowanie)

Fasada (rozpoznawalna przez metody behawioralne, które wewnętrznie wykorzystują instancje różnych niezależnych typów abstrakcyjnych / interfejsów)

Flyweight (rozpoznawalny dzięki kreatywnym metodom zwracającym buforowaną instancję, nieco pomysł „multiton”)

Proxy (recognizeable metodami kreacyjnych który zwraca realizację danego typu interfejsu Streszczenie / co z kolei delegatów / wykorzystuje się inną realizację danego typu abstract interfejsu /)


Wzorce zachowań

Łańcuch odpowiedzialności (rozpoznawalny przez metody behawioralne, które (pośrednio) wywołują tę samą metodę w innej implementacji tego samego typu abstrakcyjnego / interfejsu w kolejce)

Komenda (rozpoznawalna przez metody behawioralne w typie abstrakcyjnym / interfejsu, który wywołuje metodę w implementacji innego typu abstrakcyjnego / interfejsu, który został enkapsulowany przez implementację komendy podczas jej tworzenia)

Interpreter (rozpoznawalny przez metody behawioralne zwracające strukturalnie inną instancję / typ danej instancji / typu; zauważ, że parsowanie / formatowanie nie jest częścią wzorca, określanie wzorca i sposób jego zastosowania)

Iterator (rozpoznawalny przez metody behawioralne sekwencyjnie zwracające instancje innego typu niż kolejka)

Mediator (rozpoznawalny przez metody behawioralne przyjmujące instancję różnego typu abstrakcyjnego / interfejsu (zwykle przy użyciu wzorca poleceń), która deleguje / używa danej instancji)

Memento (rozpoznawalny przez metody behawioralne, które wewnętrznie zmieniają stan całej instancji)

Observer (lub Publish / Subscribe) (rozpoznawalny przez metody behawioralne, które wywołują metodę na instancji innego typu abstrakcyjnego / typu interfejsu, w zależności od własnego stanu)

Stan (rozpoznawalny przez metody behawioralne, które zmieniają swoje zachowanie w zależności od stanu instancji, który można kontrolować zewnętrznie)

Strategia (rozpoznawalna przez metody behawioralne w typie abstrakcyjnym / interfejsu, który wywołuje metodę w implementacji innego typu abstrakcyjnego / interfejsu, który został przekazany jako argument metody do implementacji strategii)

Metoda szablonu (rozpoznawalna przez metody behawioralne, które mają już „domyślne” zachowanie zdefiniowane przez typ abstrakcyjny)

Gość (rozpoznawalny przez dwa różne typy abstrakcyjne / interfejs, który ma zdefiniowane metody, które biorą drugi typ abstrakcyjny / interfejs; ten w rzeczywistości wywołuje metodę drugiego, a drugi wykonuje na nim pożądaną strategię)

BalusC
źródło
23
imponujące .. :) +1. javax.lang.model.elementokreśla odwiedzających;) Nie jestem do końca pewien, czy doXXXi doFiltersą „strategiami”.
Bozho
16
Wspomniane konstruktory, np. StrinbgBuilder, nie są przykładem Wzorca konstruktora. Bardzo częstym błędem jest jednak
uważanie
77
@BalusC, mam do ciebie pytanie. Czy przeczytałeś CAŁY kod źródłowy Java i JSF?
Tapas Bose
20
@Tapas: Nie przeczytałem wszystkiego, tylko części, których potrzebowałem, lub byłem po prostu ciekawy, jak to zrobili.
BalusC
7
Większość przykładów pod „Fabryczną metodą” to przykłady „statycznej fabryki”, która nie jest wzorem GoF. Niepoprawne.
okaziciela pierścienia
107
  1. Wzór obserwatora podczas całej huśtawki ( Observable, Observer)
  2. MVC również w rozkwicie
  3. Wzór adapter: InputStreamReader i OutputStreamWriter UWAGA: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapterto nie adaptery; w rzeczywistości są to obiekty zerowe. Zły wybór nazewnictwa przez Sun.
  4. Wzór dekoratora ( BufferedInputStreammoże ozdobić inne strumienie, takie jak FilterInputStream)
  5. AbstractFactory Pattern dla AWT Toolkit i Swing wtykowych klas look-and-feel
  6. java.lang.Runtime#getRuntime() jest Singleton
  7. ButtonGroup dla wzoru Mediator
  8. Action, AbstractActionmoże być używany do różnych prezentacji wizualnych w celu wykonania tego samego kodu -> Wzorzec poleceń
  9. Interned Strings lub CellRender w JTable dla Flyweight Pattern (Pomyśl również o różnych pulach - Pule wątków, pule połączeń, pule obiektów EJB - Flyweight tak naprawdę dotyczy zarządzania zasobami współdzielonymi)
  10. Model zdarzeń Java 1.0 jest przykładem łańcucha odpowiedzialności, podobnie jak filtry serwletów.
  11. Wzór iteratora w ramach kolekcji
  12. Zagnieżdżone kontenery w AWT / Swing używają wzoru Composite
  13. Menedżery układu w AWT / Swing są przykładem strategii

i wiele innych

fluktuacji
źródło
1
Dzięki za wskazówkę na temat MouseAdapter. Znalazłem tę egzaplanację: stackoverflow.com/questions/9244185/…
Lincoln
Pamiętaj, że Swing jest luźno oparty na MVC. Zawinął widok i kontroler w jedną klasę.
Matthias Braun
51
  1. Flyweight jest używany z niektórymi wartościami Byte, Short, Integer, Long i String.
  2. Fasada jest używana w wielu miejscach, ale najbardziej oczywiste są interfejsy skryptów.
  3. Singleton - java.lang.Runtime przychodzi na myśl.
  4. Fabryka abstrakcyjna - także skrypty i interfejs API JDBC.
  5. Polecenie - Cofnij / Ponów TextComponent.
  6. Interpreter - API RegEx (java.util.regex. ) I SQL (java.sql. ).
  7. Prototyp - Nie jestem w 100% pewien, czy to się liczy, ale myślę, clone()że w tym celu można zastosować metodę.
NawaMan
źródło
1
Odnośnie muszej wzoru: może to być układ z różnych zarządców java.awti java.swingpakiety. Rzeczywiście, mają one prawie identyczne wewnętrzne atrybuty, a zewnętrzne atrybuty są różnymi składnikami interfejsu użytkownika, które układają w formie interfejsu użytkownika.
Witalij
@NawaMan Powiedziałeś 5. Comand TextComponent's Undo / Redo. Myślę, że to pamiątka, a nie rozkaz. Lub najprawdopodobniej jedno i drugie.
Stimpson Cat
Czy możesz mi pomóc w pokrewnym pytaniu - stackoverflow.com/questions/61284856/… . Użyłem wzorca poleceń w tym prostym przykładzie, ale nie jestem pewien, czy jest to właściwy sposób rozwiązania mojego problemu.
Tom Joe
42

RMI opiera się na Proxy.

Powinno być możliwe zacytowanie jednego z większości 23 wzorów w GoF:

  1. Fabryka abstrakcyjna: interfejsy java.sql otrzymują swoje konkretne implementacje z JDBC JAR po zarejestrowaniu sterownika.
  2. Konstruktor: java.lang.StringBuilder.
  3. Metoda fabryczna: między innymi fabryki XML.
  4. Prototyp: Może klon (), ale nie jestem pewien, czy to kupuję.
  5. Singleton: java.lang.System
  6. Adapter: Klasy adapterów w java.awt.event, np. WindowAdapter.
  7. Bridge: Klasy kolekcji w java.util. Lista zaimplementowana przez ArrayList.
  8. Kompozyt: java.awt. java.awt.Component + java.awt.Container
  9. Dekorator: Cały pakiet java.io.
  10. Fasada: ExternalContext zachowuje się jak fasada do wykonywania plików cookie, zakresu sesji i podobnych operacji.
  11. Flyweight: liczba całkowita, postać itp.
  12. Proxy: pakiet java.rmi
  13. Łańcuch odpowiedzialności: filtry serwletów
  14. Polecenie: elementy menu Swing
  15. Tłumacz: Nie bezpośrednio w JDK, ale JavaCC z pewnością tego używa.
  16. Iterator: interfejs java.util.Iterator; nie może być jaśniejsze niż to.
  17. Mediator: JMS?
  18. Memento:
  19. Observer: java.util.Observer/Observable (choć źle zrobiony)
  20. Stan:
  21. Strategia:
  22. Szablon:
  23. Gość:

Nie mogę wymyślić przykładów w Javie dla 10 z 23, ale jutro zobaczę, czy dam radę. Po to jest edycja.

duffymo
źródło
28

Wzór Abstract Factory jest używany w różnych miejscach. Na przykład DatagramSocketImplFactory, PreferencesFactory. Istnieje wiele innych --- przeszukaj Javadoc w poszukiwaniu interfejsów, które mają w nazwie słowo „Factory”.

Jest też kilka przykładów wzorca fabrycznego.

uckelman
źródło
22

Mimo tego, że jestem zepsuty, ten interfejs API Java XML bardzo często korzysta z Factory. Popatrz na to:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

...i tak dalej i tak dalej.

Dodatkowo różne bufory (StringBuffer, ByteBuffer, StringBuilder) korzystają z Buildera.

Esko
źródło
21

java.util.Collection # Iterator jest dobrym przykładem metody fabrycznej. W zależności od konkretnej podklasy Collection, której używasz, utworzy ona implementację Iterator. Ponieważ zarówno superklasa Factory (kolekcja), jak i utworzony Iterator są interfejsami, czasami jest mylona z AbstractFactory. Większość przykładów AbstractFactory w przyjętej odpowiedzi (BalusC) to przykłady Factory , uproszczonej wersji Factory Method, która nie jest częścią oryginalnych wzorców GoF. W Facory hierarchia klas fabryki jest zwinięta, a fabryka używa innych środków, aby wybrać produkt do zwrotu.

  • Fabryka abstrakcyjna

Fabryka abstrakcyjna ma wiele metod fabrycznych, z których każda tworzy inny produkt. Produkty wytwarzane przez jedną fabrykę są przeznaczone do wspólnego użytku (drukarka i wkłady powinny być z tej samej (abstrakcyjnej) fabryki). Jak wspomniano w odpowiedziach powyżej, rodziny komponentów AWT GUI, różniących się między platformami, są tego przykładem (chociaż jego implementacja różni się od struktury opisanej w Gof).

Catweazle
źródło