Esempi di modelli di progettazione GoF nelle librerie principali di Java


672

Sto imparando GoF Java Design Patterns e voglio vederne alcuni esempi di vita reale. Quali sono alcuni buoni esempi di questi pattern di progettazione nelle librerie principali di Java?

Risposte:


3229

Puoi trovare una panoramica di molti modelli di design in Wikipedia . Indica anche quali schemi sono citati da GoF. Li riassumo qui e cercherò di assegnare il maggior numero possibile di implementazioni di pattern, presenti nelle API Java SE e Java EE.


Modelli creativi

Fabbrica astratta (riconoscibile dai metodi di creazione che restituiscono la fabbrica stessa che a sua volta può essere utilizzata per creare un altro tipo di astratta / interfaccia)

Builder (riconoscibile dai metodi di creazione che restituiscono l'istanza stessa)

Metodo di fabbrica (riconoscibile dai metodi di creazione che restituiscono un'implementazione di un tipo astratto / interfaccia)

Prototipo (riconoscibile con metodi di creazione che restituiscono un'istanza diversa di se stesso con le stesse proprietà)

Singleton (riconoscibile con metodi di creazione che restituiscono sempre la stessa istanza (di solito di se stesso))


Pattern strutturali

Adattatore (riconoscibile con metodi di creazione che prendono un'istanza di diverso tipo astratto / interfaccia e restituiscono un'implementazione del proprio / un altro tipo astratto / interfaccia che decora / ignora l'istanza data)

Bridge (riconoscibile con metodi di creazione che prendono un'istanza di diverso tipo astratto / interfaccia e restituiscono un'implementazione del proprio tipo astratto / interfaccia che delega / utilizza l'istanza data)

  • Nessuno mi viene ancora in mente. Un esempio fittizio sarebbe quello new LinkedHashMap(LinkedHashSet<K>, List<V>)che restituisce una mappa collegata non modificabile che non clona gli elementi, ma li utilizza . I metodi java.util.Collections#newSetFromMap()e singletonXXX()tuttavia si avvicinano.

Composito (riconoscibile da metodi comportamentali che prendono un'istanza dello stesso tipo astratto / interfaccia in una struttura ad albero)

Decoratore (riconoscibile con metodi di creazione che prendono un'istanza dello stesso tipo astratto / interfaccia che aggiunge un comportamento aggiuntivo)

Facciata (riconoscibile con metodi comportamentali che utilizzano internamente istanze di diversi tipi astratti / di interfaccia indipendenti)

Flyweight (riconoscibile con metodi di creazione che restituiscono un'istanza memorizzata nella cache, un po 'l'idea "multitono")

Proxy (riconoscibile mediante metodi creational che restituisce un'implementazione dato tipo interfaccia astratta / che a sua volta delegati / utilizza una diversa implementazione di dato tipo di interfaccia / abstract)


Modelli comportamentali

Catena di responsabilità (riconoscibile da metodi comportamentali che (indirettamente) invoca lo stesso metodo in un'altra implementazione dello stesso tipo astratto / interfaccia in una coda)

Comando (riconoscibile dai metodi comportamentali in un tipo astratto / interfaccia che richiama un metodo in un'implementazione di un diverso tipo astratto / interfaccia che è stato incapsulato dall'implementazione del comando durante la sua creazione)

Interprete (riconoscibile dai metodi comportamentali che restituiscono un'istanza / tipo strutturalmente diversi di una determinata istanza / tipo; notare che l'analisi / formattazione non fa parte del modello, determinando il modello e come applicarlo è)

Iteratore (riconoscibile dai metodi comportamentali che restituiscono sequenzialmente istanze di un tipo diverso da una coda)

Mediatore (riconoscibile da metodi comportamentali che prendono un'istanza di diverso tipo astratto / interfaccia (di solito usando il modello di comando) che delega / usa l'istanza data)

Memento (riconoscibile con metodi comportamentali che modificano internamente lo stato dell'intera istanza)

Observer (o Pubblica / Sottoscrivi) (riconoscibile da metodi comportamentali che invocano un metodo su un'istanza di un altro tipo astratto / interfaccia, a seconda del proprio stato)

Stato (riconoscibile da metodi comportamentali che cambiano il suo comportamento in base allo stato dell'istanza che può essere controllato esternamente)

Strategia (riconoscibile dai metodi comportamentali in un tipo astratto / interfaccia che richiama un metodo in un'implementazione di un diverso tipo astratto / interfaccia che è stato passato come argomento del metodo nell'attuazione della strategia)

Metodo modello (riconoscibile da metodi comportamentali che hanno già un comportamento "predefinito" definito da un tipo astratto)

Visitatore (riconoscibile da due diversi tipi di astratto / interfaccia che hanno dei metodi definiti che prendono l'un l' altro tipo di astratto / interfaccia; l'uno chiama effettivamente il metodo dell'altro e l'altro esegue la strategia desiderata su di esso)


23
impressionante .. :) +1. javax.lang.model.elementdefinisce i visitatori;) Non sono del tutto sicuro se doXXXe doFiltersiano "strategie".
Bozho,

16
I costruttori citati, ad esempio StrinbgBuilder, non sono tutti un esempio per il Builder-Pattern. È tuttavia un errore molto comune considerarli come costruttori (quindi non si deve davvero incolpare ^ _ ^)
Angel O'Sphere,

77
@BalusC, ho una domanda da farti. Hai letto il codice sorgente INTERO di Java e JSF?
Tapas Bose,

20
@Tapas: non ho letto tutto, solo le parti di cui avevo bisogno, o ero solo curioso di sapere come "lo facessero".
BalusC

7
La maggior parte degli esempi in "Metodo di fabbrica" ​​sono esempi di "fabbrica statica" che non è un modello GoF. Non corretto.
portatore dell'anello,

107
  1. Modello di osservatore per tutta l'oscillazione ( Observable, Observer)
  2. MVC anche in altalena
  3. Pattern Adapter: InputStreamReader e OutputStreamWriter NOTA: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdaptersono senza adattatori; in realtà sono oggetti nulli. Scarsa scelta di denominazione da parte di Sun.
  4. Motivo BufferedInputStreamdecorativo ( può decorare altri flussi come FilterInputStream)
  5. Pattern AbstractFactory per AWT Toolkit e le classi di innestabilità innestabili Swing
  6. java.lang.Runtime#getRuntime() è Singleton
  7. ButtonGroup per modello mediatore
  8. Action, AbstractActionpuò essere utilizzato per diverse rappresentazioni visive per eseguire lo stesso codice -> Pattern di comando
  9. Interned Strings o CellRender in JTable per Flyweight Pattern (Pensa anche a vari pool - Pool di thread, pool di connessioni, pool di oggetti EJB - Flyweight riguarda davvero la gestione delle risorse condivise)
  10. Il modello di eventi Java 1.0 è un esempio di Chain of Responsibility, così come i filtri servlet.
  11. Modello Iteratore nel Framework Collezioni
  12. I contenitori nidificati in AWT / Swing utilizzano il modello composito
  13. I gestori di layout in AWT / Swing sono un esempio di strategia

e molti altri immagino


1
Grazie per il suggerimento su MouseAdapter. Ho trovato questo exaplanation: stackoverflow.com/questions/9244185/...
Lincoln

Si noti che Swing si basa solo vagamente su MVC. Ha compresso View e Controller in una classe.
Matthias Braun il

51
  1. Flyweight è utilizzato con alcuni valori di Byte, Short, Integer, Long e String.
  2. La facciata viene utilizzata in molti luoghi, ma la più ovvia sono le interfacce di scripting.
  3. Singleton - java.lang.Runtime mi viene in mente.
  4. Abstract Factory - Anche scripting e API JDBC.
  5. Comando - Annulla / Ripeti di TextComponent.
  6. Interprete - API RegEx (java.util.regex. ) E SQL (java.sql. ).
  7. Prototipo - Non sono sicuro al 100% se questo conta, ma credo che il clone()metodo possa essere usato per questo scopo.

1
Per quanto riguarda il modello Flyweight : potrebbero essere diversi gestori di layout java.awte java.swingpacchetti. In effetti, condividono attributi intrinseci quasi identici e gli attributi estrinseci sono diversi componenti dell'interfaccia utente che presentano in forma di interfaccia utente.
Vitaly,

@NawaMan Hai detto 5. Comando TextComponent's Undo / Redo. Penso che sia un ricordo, non un comando. O molto probabilmente entrambi.
Stimpson Cat,

La prego di aiutarmi in una domanda correlata - stackoverflow.com/questions/61284856/… . Ho usato il modello di comando in questo semplice esempio, ma non sono sicuro che sia il modo giusto per risolvere il mio problema.
Tom Joe,

42

RMI si basa sul proxy.

Dovrebbe essere possibile citarne uno per la maggior parte dei 23 modelli in GoF:

  1. Abstract Factory: le interfacce java.sql ottengono tutte le loro implementazioni concrete da JDBC JAR quando il driver è registrato.
  2. Costruttore: java.lang.StringBuilder.
  3. Metodo di fabbrica: stabilimenti XML, tra gli altri.
  4. Prototipo: forse clone (), ma non sono sicuro di acquistarlo.
  5. Singleton: java.lang.System
  6. Adattatore: classi dell'adattatore in java.awt.event, ad esempio WindowAdapter.
  7. Bridge: lezioni di raccolta in java.util. Elenco implementato da ArrayList.
  8. Composito: java.awt. java.awt.Component + java.awt.Container
  9. Decoratore: tutto il pacchetto java.io.
  10. Facciata: ExternalContext si comporta come una facciata per l'esecuzione di cookie, ambito di sessione e operazioni simili.
  11. Peso mosca: intero, carattere, ecc.
  12. Proxy: pacchetto java.rmi
  13. Catena di responsabilità: filtri servlet
  14. Comando: Swing voci di menu
  15. Interprete: No direttamente in JDK, ma JavaCC lo usa sicuramente.
  16. Iteratore: interfaccia java.util.Iteratore; non può essere più chiaro di così.
  17. Mediatore: JMS?
  18. Memento:
  19. Observer: java.util.Observer/Observable (mal fatto, però)
  20. Stato:
  21. Strategia:
  22. Modello:
  23. Visitatore:

Non riesco a pensare ad esempi in Java per 10 su 23, ma vedrò se domani posso fare di meglio. Ecco a cosa serve la modifica.


28

Il modello Abstract Factory viene utilizzato in vari punti. Ad esempio, DatagramSocketImplFactory, PreferencesFactory. Ce ne sono molti altri --- cerca nel Javadoc interfacce che hanno la parola "Factory" nel loro nome.

Inoltre, ci sono anche alcuni esempi del modello Factory.


22

Anche se sono una specie di orologio rotto con questo, l'API XML Java usa molto Factory. Voglio dire, guarda questo:

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

...E così via e così via.

Inoltre, vari buffer (StringBuffer, ByteBuffer, StringBuilder) utilizzano Builder.


21

java.util.Collection # Iterator è un buon esempio di un metodo Factory. A seconda della sottoclasse concreta di Collection utilizzata, verrà creata un'implementazione Iterator. Poiché sia ​​la superclasse Factory (Collection) che l'Iterator creati sono interfacce, a volte viene confuso con AbstractFactory. La maggior parte degli esempi di AbstractFactory nella risposta accettata (BalusC) sono esempi di Factory , una versione semplificata del metodo Factory, che non fa parte dei modelli GoF originali. In Facory la gerarchia di classe Factory è crollata e la factory utilizza altri mezzi per scegliere il prodotto da restituire.

  • Fabbrica astratta

Una fabbrica astratta ha più metodi di fabbrica, ognuno dei quali crea un prodotto diverso. I prodotti fabbricati da una fabbrica devono essere usati insieme (la stampante e le cartucce devono essere della stessa fabbrica (astratta)). Come menzionato nelle risposte sopra, le famiglie di componenti della GUI di AWT, che differiscono da piattaforma a piattaforma, ne sono un esempio (sebbene la sua implementazione differisca dalla struttura descritta in Gof).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.