Question Exemples de motifs de conception GoF dans les bibliothèques principales de Java


J'apprends les modèles de conception de Java de GoF et je veux voir quelques exemples concrets de eux. Quels sont quelques bons exemples de ces modèles de conception dans les bibliothèques de base de Java?


673


origine


Réponses:


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


Modèles créatifs

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

Constructeur  (reconnaissable par des méthodes de création retournant l'instance elle-même)

Méthode d'usine  (reconnaissable par des méthodes de création retournant une implémentation d'un type abstract / interface)

Prototype  (reconnaissable par des méthodes de création retournant un différent instance de lui-même avec les mêmes propriétés)

Singleton  (reconnaissable par des méthodes de création retournant le même instance (généralement de lui-même) à chaque fois)


Modèles structurels

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

Pont  (reconnaissable par des méthodes de création prenant une instance de différent type abstrait / interface et renvoyant une implémentation de son propre type abstrait / interface qui délégués / utilisations l'instance donnée)

  • Aucun ne vient à l'esprit pour l'instant. Un exemple fictif serait new LinkedHashMap(LinkedHashSet<K>, List<V>) qui renvoie une carte liée non modifiable qui ne clone pas les éléments, mais les usages leur. le java.util.Collections#newSetFromMap() et singletonXXX() les méthodes sont cependant proches.

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

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

Façade  (reconnaissable par des méthodes comportementales qui utilisent en interne des instances de différent types de résumé / interface indépendants)

Poids mouche  (reconnaissable par des méthodes de création retournant une instance en cache, un peu l'idée "multiton")

Procuration  (reconnaissable par des méthodes de création qui retourne une implémentation de type abstract / interface donné qui à son tour délégués / utilisations une différent implémentation du type abstract / interface donné)


Les modèles comportementaux

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

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

Interprète  (reconnaissable par des méthodes comportementales retournant une structurellement instance / type différent de l'instance / type donné; notez que l'analyse / la mise en forme ne fait pas partie du modèle, en déterminant le modèle et comment l'appliquer est)

Iterator  (reconnaissable par des méthodes comportementales retournant séquentiellement des instances d'un différent tapez à partir d'une file d'attente)

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

Mémento  (reconnaissable par des méthodes comportementales qui changent en interne l'état de la entier exemple)

Observateur (ou Publier / Souscrire)  (reconnaissable par des méthodes comportementales qui invoquent une méthode sur une instance de un autre type abstrait / interface, en fonction de son propre état)

Etat  (reconnaissable par des méthodes comportementales qui changent son comportement en fonction de l'état de l'instance qui peut être contrôlé extérieurement)

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

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

Visiteur  (reconnaissable par deux différent types abstrait / interface qui a des méthodes définies qui prend chacune la autre type abstrait / interface; l'un appelle la méthode de l'autre et l'autre exécute la stratégie désirée)


2843



  1. Motif d'observateur tout au long du swing (Observable, Observer)
  2. MVC aussi en balançoire
  3. Modèle d'adaptateur: InputStreamReader et OutputStreamWriter  REMARQUE: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapter sont ne pas adaptateurs; ils sont en fait des objets nuls. Mauvais choix de nom par Sun.
  4. Motif de décorateur (BufferedInputStream peut décorer d'autres flux tels que FilterInputStream)
  5. AbstractFactory Pattern pour AWT Toolkit et les classes de présentation et d'analyse Swing connectables
  6. java.lang.Runtime#getRuntime() est Singleton
  7. ButtonGroup pour le modèle Mediator
  8. Action, AbstractAction peut être utilisé pour différentes représentations visuelles pour exécuter le même code -> Motif de commande
  9. Internes Strings ou CellRender dans JTable pour Flyweight Pattern (Pensez aussi aux 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 le cadre des collections
  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 beaucoup plus je suppose


97



  1. Poids mouche est utilisé avec certaines valeurs de Byte, Short, Integer, Long et String.
  2. Façade est utilisé dans de nombreux endroits, mais le plus évident est les interfaces de script.
  3. Singleton - java.lang.Runtime vient à l'esprit.
  4. Usine abstraite - Scripting et API JDBC.
  5. Commander - Undo / Redo de TextComponent.
  6. Interprète - RegEx (java.util.regex.) et SQL (java.sql.API.
  7. Prototype - Pas sûr à 100% si cela compte, mais je pense clone() La méthode peut être utilisée à cette fin.

48



RMI est basé sur le proxy.

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

  1. Usine abstraite: les interfaces java.sql obtiennent toutes leurs implémentations concrètes à partir du fichier JDBC JAR lorsque le pilote est enregistré.
  2. Constructeur: java.lang.StringBuilder.
  3. Méthode d'usine: les usines XML, entre autres.
  4. Prototype: Peut-être que clone (), mais je ne suis pas sûr d'acheter ça.
  5. Singleton: java.lang.System
  6. Adaptateur: Classes d'adaptateur dans java.awt.event, par exemple, WindowAdapter.
  7. Bridge: classes de collection dans java.util. Liste implémentée par ArrayList.
  8. Composé: java.awt. java.awt.Component + java.awt.Container
  9. Décorateur: Partout dans le paquet java.io.
  10. Façade: ExternalContext se comporte comme une façade pour l'exécution de cookie, de portée de session et d'opérations similaires.
  11. Poids volé: 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. Iterator: 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 verrai si je peux faire mieux demain. C'est ce que l'édition est pour.


39



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

En outre, il existe également quelques exemples du modèle Factory.


26



Même si je suis en quelque sorte une horloge brisée avec celle-ci, Java XML API utilise beaucoup Factory. Je veux dire juste regarder 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.


20



java.util.Collection # Iterator est un bon exemple de méthode d'usine. Selon la sous-classe concrète de Collection que vous utilisez, il va créer une implémentation d'Iterator. Étant donné que la superclasse Factory (Collection) et l'Iterator créés sont des interfaces, il est parfois confondu avec AbstractFactory. La plupart des exemples de AbstractFactory dans la réponse acceptée (BalusC) sont des exemples de Usine, 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 Factory 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 usine sont destinés à être utilisés ensemble (votre imprimante et vos cartouches doivent être issues de la même usine (abstraite). Comme mentionné dans les réponses ci-dessus, les familles de composants AWT GUI, qui diffèrent d'une plateforme à l'autre, en sont un exemple (bien que sa mise en œuvre diffère de la structure décrite dans Gof).


19