672 votes

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

Je suis en train d'apprendre les modèles de conception Java GoF et je veux voir des exemples concrets de ces modèles. Quels sont les bons exemples de ces Design Patterns dans les bibliothèques de base de Java ?

3521voto

BalusC Points 498232

Vous pouvez trouver une vue d'ensemble de nombreux modèles de conception dans Wikipedia . Il mentionne également les motifs mentionnés par GoF. Je les résumerai ici et j'essaierai d'attribuer autant d'implémentations de patrons que possible, trouvés à la fois dans les API Java SE et Java EE.


Modèles créatifs

Usine abstraite (reconnaissable aux méthodes de création renvoyant la fabrique elle-même qui, à son tour, peut être utilisée pour créer un autre type abstrait/interface)

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

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

Prototype (reconnaissable par les méthodes de création retournant un <em>différents </em>instance de lui-même avec les mêmes propriétés)

Singleton (reconnaissable par les méthodes de création renvoyant le <em>même </em>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 <em>différents </em>abstrait/interface et renvoyer une implémentation de son propre/autre type abstrait/interface qui <em>décore/supprime </em>l'instance donnée)

Pont (reconnaissable par des méthodes de création prenant une instance de <em>différents </em>et retourner une implémentation de son propre type d'abstraction/interface qui <em>délégués/utilisateurs </em>l'instance donnée)

  • Aucune ne me vient encore à l'esprit. 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 utilise les. Le site java.util.Collections#newSetFromMap() y singletonXXX() Cependant, les méthodes d'analyse s'en rapprochent.

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

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

Façade (reconnaissable par les méthodes comportementales qui utilisent en interne des instances de <em>différents </em>types abstraits/interfaces indépendants)

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

Proxy (reconnaissable par des méthodes de création qui renvoient une implémentation d'un type abstrait/interface donné, qui à son tour <em>délégués/utilisateurs </em>a <em>différents </em>implémentation d'un type abstrait/interface donné)


Modèles de comportement

Chaîne de responsabilité (reconnaissable par les méthodes comportementales qui invoquent (indirectement) la même méthode en <em>un autre </em>mise en œuvre de <em>même </em>type abstrait/interface dans une file d'attente)

Commande (reconnaissable par les méthodes comportementales d'un type abstrait/interface qui invoque une méthode dans une mise en œuvre d'une <em>différents </em>type abstrait/interface qui a été <em>encapsulé </em>par l'implémentation de la commande lors de sa création)

Interprète (reconnaissable par les méthodes comportementales retournant un <em>structurellement </em>instance/type différent(e) de l'instance/du type donné(e) ; notez que l'analyse syntaxique/le formatage ne fait pas partie du modèle, la détermination du modèle et la manière de l'appliquer en font partie)

Itérateur (reconnaissable par les méthodes comportementales renvoyant séquentiellement des instances d'une <em>différents </em>d'une file d'attente)

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

Memento (reconnaissable par des méthodes comportementales qui changent en interne l'état de la <em>ensemble du site </em>instance)

Observateur (ou Publier/S'abonner) (reconnaissable aux méthodes comportementales qui invoquent une méthode sur une instance de <em>un autre </em>type abstrait/interface, selon l'état propre)

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

Stratégie (reconnaissable par les méthodes comportementales d'un type abstrait/interface qui invoque une méthode dans une mise en œuvre d'une <em>différents </em>type abstrait/interface qui a été <em>adopté </em>comme argument de méthode dans la mise en œuvre de la stratégie)

Méthode du 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 <em>différents </em>des types abstraits/interfaces qui ont des méthodes définies qui prennent chaque <em>autre </em>type abstrait/interface ; l'un appelle effectivement la méthode de l'autre et l'autre exécute la stratégie souhaitée sur celle-ci)

116voto

jitter Points 35805
  1. Motif d'observateur dans tout le swing ( Observable , Observer )
  2. MVC aussi dans le swing
  3. Modèle d'adaptateur : InputStreamReader et OutputStreamWriter NOTE : ContainerAdapter , ComponentAdapter , FocusAdapter , KeyAdapter , MouseAdapter son no adaptateurs ; ils sont en fait des Null Objects. Mauvais choix de dénomination de la part de Sun.
  4. Motif décorateur ( BufferedInputStream peut décorer d'autres flux tels que FilterInputStream )
  5. Modèle AbstractFactory pour la boîte à outils AWT et les classes de look-and-feel enfichables Swing.
  6. java.lang.Runtime#getRuntime() est Singleton
  7. ButtonGroup pour le modèle de médiateur
  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 internes ou CellRender dans JTable pour le modèle Flyweight (pensez aussi aux différents pools - pools de threads, pools de connexions, pools d'objets EJB - Flyweight est vraiment une question de gestion de 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 servlets.
  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 bien d'autres encore, je suppose

53voto

NawaMan Points 10266
  1. Poids plume 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 celui des interfaces de script.
  3. Singleton - Je pense à java.lang.Runtime.
  4. Usine abstraite - Egalement Scripting et JDBC API.
  5. Commande - Undo/Redo de TextComponent.
  6. Interprète - RegEx (java.util.regex. ) et SQL (java.sql. ) API.
  7. Prototype - Je ne suis pas sûr à 100% que ça compte, mais je pense que clone() peut être utilisée à cette fin.

43voto

duffymo Points 188155

RMI est basé sur le Proxy.

Il devrait être possible d'en citer un pour la plupart des 23 motifs du GdF :

  1. Fabrique abstraite : les interfaces java.sql obtiennent toutes leurs implémentations concrètes à partir du JAR JDBC lorsque le pilote est enregistré.
  2. Constructeur : java.lang.StringBuilder.
  3. Méthode d'usine : Usines XML, entre autres.
  4. Prototype : Peut-être clone(), mais je ne suis pas sûr d'y croire.
  5. Singleton : java.lang.System
  6. Adaptateur : Classes d'adaptateur dans java.awt.event, par exemple WindowAdapter.
  7. Pont : Classes de collection en java.util. Liste implémentée par ArrayList.
  8. Composite : 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 permettant d'effectuer des opérations sur les cookies, la portée de la session et autres opérations similaires.
  11. Poids plume : Entier, caractère, etc.
  12. Proxy : paquet java.rmi
  13. Chaîne de responsabilité : Les filtres de servlets
  14. Commandement : Faire pivoter les éléments du menu
  15. Interprète : Pas directement dans le JDK, mais JavaCC l'utilise certainement.
  16. Iterator : interface java.util.Iterator ; on ne peut pas être plus clair que ça.
  17. Médiateur : JMS ?
  18. Memento :
  19. Observer : java.util.Observer/Observable (mal fait, cependant)
  20. État :
  21. Stratégie :
  22. Modèle :
  23. Visiteur :

Je n'arrive pas à trouver d'exemples en Java pour 10 des 23, mais je verrai si je peux faire mieux demain. C'est à ça que sert l'édition.

31voto

uckelman Points 7228

Le modèle Abstract Factory est utilisé à différents endroits. Par exemple, DatagramSocketImplFactory , PreferencesFactory . Il y en a beaucoup d'autres - recherchez dans la Javadoc les interfaces dont le nom contient le mot "Factory".

Il y a également de nombreuses occurrences du modèle Factory.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X