Exemples de modèles de conception GoF dans les bibliothèques principales de Java

672

J'apprends GoF Java Design Patterns et je veux en voir des exemples réels. Quels sont de bons exemples de ces modèles de conception dans les bibliothèques principales de Java?

unj2
la source

Réponses:

3229

Vous pouvez trouver un aperçu de nombreux modèles de conception dans Wikipedia . Il mentionne également les modèles mentionnés par le GoF. Je vais les résumer ici et essayer d'attribuer autant d'implémentations de modèles que possible, trouvées dans les API Java SE et Java EE.


Modèles de création

Usine abstraite (reconnaissable par les méthodes de création renvoyant l'usine elle-même qui à son tour peut être utilisée pour créer un autre type abstrait / interface)

Builder (reconnaissable par les méthodes de création renvoyant l'instance elle-même)

Méthode d'usine (reconnaissable par les méthodes de création renvoyant une implémentation d'un type abstrait / interface)

Prototype (reconnaissable par les méthodes de création renvoyant une instance différente de lui-même avec les mêmes propriétés)

Singleton (reconnaissable par les méthodes de création renvoyant la même instance (généralement d'elle-même) à chaque fois)


Modèles structurels

Adaptateur (reconnaissable par les méthodes de création prenant une instance de type abstrait / interface différent et retournant une implémentation de propre / autre type abstrait / interface qui décore / remplace l'instance donnée)

Pont (reconnaissable par les méthodes de création prenant une instance de type abstrait / interface différent et retournant une implémentation de son propre type abstrait / interface qui délègue / utilise l'instance donnée)

  • Personne ne me vient encore à l'esprit. Un exemple fictif serait celui new LinkedHashMap(LinkedHashSet<K>, List<V>)qui retourne une carte liée non modifiable qui ne clone pas les éléments, mais les utilise . Les java.util.Collections#newSetFromMap()et singletonXXX()méthodes vient cependant à proximité.

Composite (reconnaissable par les méthodes comportementales prenant une instance du même type abstrait / interface dans une structure arborescente)

Décorateur (reconnaissable par les méthodes de création prenant une instance du même type abstrait / interface qui ajoute un comportement supplémentaire)

Façade (reconnaissable par les méthodes comportementales qui utilisent en interne des instances de différents types d'abrégés / d'interfaces indépendants)

Flyweight (reconnaissable par les méthodes de création renvoyant une instance mise en cache, un peu l'idée "multiton")

Proxy (reconnaissable par les méthodes de création qui renvoie une implémentation du type abstrait / interface donné qui à son tour délègue / utilise une implémentation différente du type abstrait / interface donné)


Modèles comportementaux

Chaîne de responsabilité (reconnaissable par les méthodes comportementales qui invoquent (indirectement) la même méthode dans une autre implémentation du même type abstrait / interface dans une file d'attente)

Commander (reconnaissable par les méthodes comportementales dans un type abstrait / interface qui invoque une méthode dans une implémentation d'un type abstrait / interface différent qui a été encapsulé par l'implémentation de commande lors de sa création)

Interpréteur (reconnaissable par les méthodes comportementales renvoyant une instance / un type structurellement différent de l'instance / du type donné; notez que l'analyse / le formatage ne fait pas partie du modèle, déterminant le modèle et comment l'appliquer)

Itérateur (reconnaissable par les méthodes comportementales renvoyant séquentiellement des instances d'un type différent à partir d'une file d'attente)

Médiateur (reconnaissable par les méthodes comportementales prenant une instance de type abstrait / interface différent (généralement en utilisant le modèle de commande) qui délègue / utilise l'instance donnée)

Memento (reconnaissable par les méthodes comportementales qui modifient en interne l'état de l' instance entière )

Observer (ou Publish / Subscribe) (reconnaissable par les méthodes comportementales qui invoquent une méthode sur une instance d' un autre type abstrait / interface, selon son propre état)

État (reconnaissable par les méthodes comportementales qui modifient son comportement en fonction de l'état de l'instance qui peut être contrôlé en externe)

Stratégie (reconnaissable par les méthodes comportementales dans un type abstrait / interface qui invoque une méthode dans une implémentation d'un type abstrait / interface différent qui a été transmis comme argument de méthode dans l'implémentation de la stratégie)

Méthode modèle (reconnaissable par les méthodes comportementales qui ont déjà un comportement "par défaut" défini par un type abstrait)

Visiteur (reconnaissable par deux types d' abrégés / d'interfaces différents qui ont défini des méthodes qui prennent chacun l' autre type d' abrégé / d'interface; l'un appelle en fait la méthode de l'autre et l'autre exécute la stratégie souhaitée dessus)

BalusC
la source
23
impressionnant .. :) +1. javax.lang.model.elementdéfinit les visiteurs;) Je ne sais pas trop si doXXXet doFiltersont des "stratégies".
Bozho
16
Les constructeurs mentionnés, par exemple StrinbgBuilder, ne sont pas tous un exemple pour le Builder-Pattern. C'est une erreur très courante cependant de les considérer comme des constructeurs (donc vous n'êtes pas vraiment à blâmer ^ _ ^)
Angel O'Sphere
77
@BalusC, j'ai une question à vous poser. Avez-vous lu le code source COMPLET de Java et JSF?
Tapas Bose
20
@Tapas: Je n'ai pas tout lu, seulement les parties dont j'avais besoin, ou j'étais simplement curieux de savoir comment "ils" l'ont fait.
BalusC
7
La plupart des exemples sous "Méthode d'usine" sont des exemples de "usine statique" qui n'est pas un modèle GoF. Pas correcte.
porteur de l'anneau
107
  1. Modèle d'observateur tout au long du swing ( Observable, Observer)
  2. MVC aussi en swing
  3. Motif adaptateur: InputStreamReader et OutputStreamWriter REMARQUE: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdaptersont pas des adaptateurs; ce sont en fait des objets nuls. Mauvais choix de nom par Sun.
  4. Modèle de décorateur ( BufferedInputStreampeut décorer d'autres flux tels que FilterInputStream)
  5. AbstractFactory Pattern pour l'AWT Toolkit et les classes de look-and-feel enfichables Swing
  6. java.lang.Runtime#getRuntime() est Singleton
  7. ButtonGroup pour motif Mediator
  8. Action, AbstractAction peut être utilisé pour différentes représentations visuelles pour exécuter le même code -> Modèle de commande
  9. Chaînes internées ou CellRender dans JTable pour Flyweight Pattern (Pensez également à différents pools - Pools de threads, pools de connexions, pools d'objets EJB - Flyweight concerne vraiment la gestion des ressources partagées)
  10. Le modèle d'événement Java 1.0 est un exemple de chaîne de responsabilité, tout comme les filtres de servlet.
  11. Modèle d'itérateur dans Collections Framework
  12. Les conteneurs imbriqués dans AWT / Swing utilisent le modèle Composite
  13. Les gestionnaires de mise en page dans AWT / Swing sont un exemple de stratégie

et bien d'autres je suppose

gigue
la source
1
Merci pour l'astuce sur MouseAdapter. J'ai trouvé cette explication: stackoverflow.com/questions/9244185/…
Lincoln
Notez que Swing n'est basé que sur MVC. Il a regroupé View et Controller en une seule classe.
Matthias Braun
51
  1. Flyweight est utilisé avec certaines valeurs de Byte, Short, Integer, Long et String.
  2. La façade est utilisée à de nombreux endroits, mais la plus évidente est les interfaces de script.
  3. Singleton - java.lang.Runtime vient à l'esprit.
  4. Abstract Factory - Également script et API JDBC.
  5. Commande - Annuler / Rétablir de TextComponent.
  6. Interprète - RegEx (java.util.regex. ) Et SQL (java.sql. API ).
  7. Prototype - Je ne suis pas sûr à 100% de ce nombre, mais je pense que la clone()méthode peut être utilisée à cette fin.
NawaMan
la source
1
Concernant le modèle Flyweight : il peut s'agir de différents Layout Managers java.awtet java.swingpackages. En effet, ils partagent des attributs intrinsèques presque identiques et les attributs extrinsèques sont des composants d'interface utilisateur différents qu'ils présentent sous forme d'interface utilisateur.
Vitaly
@NawaMan Vous avez dit 5. Annuler / Refaire de Comand TextComponent. Je pense que c'est memento pas de commande. Ou très probablement les deux.
Stimpson Cat
Pourriez-vous s'il vous plaît m'aider dans une question connexe - stackoverflow.com/questions/61284856/… . J'ai utilisé le modèle de commande dans cet exemple simple, mais je ne sais pas si c'est la bonne façon de résoudre mon problème.
Tom Joe
42

RMI est basé sur Proxy.

Il devrait être possible d'en citer un pour la plupart des 23 modèles du GoF:

  1. Abstract Factory: les interfaces java.sql obtiennent toutes leurs implémentations concrètes de JDBC JAR lorsque le pilote est enregistré.
  2. Générateur: java.lang.StringBuilder.
  3. Méthode d'usine: usines XML, entre autres.
  4. Prototype: Peut-être clone (), mais je ne suis pas sûr de l'acheter.
  5. Singleton: java.lang.System
  6. Adapter: classes d'adaptateurs dans java.awt.event, par exemple, WindowAdapter.
  7. Bridge: classes de collection dans java.util. Liste implémentée par ArrayList.
  8. Composite: java.awt. java.awt.Component + java.awt.Container
  9. Décorateur: partout dans le package java.io.
  10. Façade: ExternalContext se comporte comme une façade pour effectuer des cookies, une portée de session et des opérations similaires.
  11. Poids mouche: entier, caractère, etc.
  12. Proxy: package java.rmi
  13. Chaîne de responsabilité: filtres de servlet
  14. Commande: éléments de menu Swing
  15. Interprète: Non directement dans JDK, mais JavaCC l'utilise certainement.
  16. Itérateur: interface java.util.Iterator; ne peut pas être plus clair que cela.
  17. Médiateur: JMS?
  18. Mémento:
  19. Observateur: java.util.Observer/Observable (mal fait, cependant)
  20. Etat:
  21. Stratégie:
  22. Modèle:
  23. Visiteur:

Je ne peux pas penser à des exemples en Java pour 10 sur 23, mais je vais voir si je peux faire mieux demain. C'est à ça que sert l'édition.

duffymo
la source
28

Le motif Abstract Factory est utilisé à divers endroits. Par exemple, DatagramSocketImplFactory, PreferencesFactory. Il y en a beaucoup plus --- recherchez dans Javadoc des interfaces qui ont le mot "Factory" dans leur nom.

Il existe également de nombreuses instances du modèle Factory.

uckelman
la source
22

Même si je suis en quelque sorte une horloge cassée avec celle-ci, l'API Java XML utilise beaucoup Factory. Je veux juste dire ceci:

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

...et ainsi de suite.

De plus, divers tampons (StringBuffer, ByteBuffer, StringBuilder) utilisent Builder.

Esko
la source
21

java.util.Collection # Iterator est un bon exemple de méthode d'usine. En fonction de la sous-classe concrète de Collection que vous utilisez, elle créera une implémentation Iterator. Parce que la superclasse Factory (Collection) et l'itérateur créé sont des interfaces, il est parfois confondu avec AbstractFactory. La plupart des exemples pour AbstractFactory dans la réponse acceptée (BalusC) sont des exemples de Factory , une version simplifiée de Factory Method, qui ne fait pas partie des modèles GoF d'origine. Dans Facory, la hiérarchie des classes d'usine est réduite et l'usine utilise d'autres moyens pour choisir le produit à retourner.

  • Usine abstraite

Une usine abstraite a plusieurs méthodes d'usine, chacune créant un produit différent. Les produits fabriqués par une seule usine sont destinés à être utilisés ensemble (il est préférable que votre imprimante et vos cartouches proviennent de la même usine (abstraite)). Comme mentionné dans les réponses ci-dessus, les familles de composants AWT GUI, différentes d'une plateforme à l'autre, en sont un exemple (bien que sa mise en œuvre diffère de la structure décrite dans Gof).

3 tours
la source