web-dev-qa-db-fra.com

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

J'apprends le GoF Java Design Patterns et je souhaite en voir des exemples concrets. Quels sont quelques bons exemples de ces modèles de conception dans les bibliothèques principales de Java?

672
unj2

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


Modèles de création

Fabrique abstraite (reconnaissable par les méthodes de création renvoyant la fabrique elle-même qui peut être utilisée pour créer un autre type abstrait/interface)

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

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

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

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


Structures structurelles

Adaptateur (reconnaissable par des méthodes de création prenant une instance de différent type abstrait/interface et renvoyant une implémentation de type propre/autre type abstrait/interface qui décore/substitue 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/utilise l'instance donnée)

  • Aucun ne me vient à l'esprit pour l'instant. Un exemple fictif serait new LinkedHashMap(LinkedHashSet<K>, List<V>) qui retourne une carte liée non modifiable qui ne clone pas les éléments, mais utilise eux. Les méthodes Java.util.Collections#newSetFromMap() et singletonXXX() se rapprochent toutefois.

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

Décorateur (reconnaissable par des méthodes créatives prenant une instance de same abstrait/type d'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 abstraits indépendants/interfaces)

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

Proxy (reconnaissable par des méthodes creational qui retourne une implémentation de type abstrait/interface donné qui délégués/utilise a différent implémentation donnée type abstrait/interface)


Patterns comportementaux

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

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

interprète (reconnaissable par les méthodes comportementales renvoyant une structurellement instance/type différente de l'instance/du type donné; notez que l'analyse/la mise en forme ne fait pas partie du modèle, ce qui détermine le modèle et comment l'appliquer c'est)

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

médiateur (reconnaissable par des méthodes comportementales prenant une instance de type abstrait/interface différent (en 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 l'instance whole )

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

Etat (reconnaissable par des méthodes comportementales qui changent de comportement en fonction de l'état de l'instance pouvant être contrôlé de manière externe)

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 l'implémentation 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 abstraits/interfaces dont les méthodes sont définies et qui prennent chacun autres types abstraits/interfaces; celui en fait appelle la méthode de l'autre et l'autre exécute la stratégie souhaitée)

3101
BalusC
  1. Motif d'observateur pendant toute la durée du mouvement (Observable, Observer)
  2. MVC aussi en swing
  3. Modèle d'adaptateur: InputStreamReader et OutputStreamWriter REMARQUE: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapter sont non adaptateurs; ce sont en fait des objets nuls. Mauvais choix de nommage par Sun.
  4. Motif de décorateur (BufferedInputStream peut décorer d'autres flux tels que FilterInputStream)
  5. Modèle AbstractFactory pour la classe AWT Toolkit et les classes de style et de fonctionnalité enfichables Swing
  6. Java.lang.Runtime#getRuntime() est Singleton
  7. ButtonGroup pour le motif Mediator
  8. Action, AbstractAction peut être utilisé pour différentes représentations visuelles afin d'exécuter le même code -> Modèle de commande
  9. Interned Strings ou CellRender dans JTable pour le modèle Flyweight (Pensez également à différents pools - pools de threads, pools de connexion, pools d'objet EJB - Flyweight concerne réellement la gestion des ressources partagées).
  10. Le modèle d'événement Java 1.0 est un exemple de chaîne de responsabilité, au même titre que les filtres de servlet.
  11. Motif Itérateur dans le cadre des collections
  12. Les conteneurs imbriqués dans AWT/Swing utilisent le modèle Composite.
  13. Les gestionnaires de disposition dans AWT/Swing sont un exemple de stratégie

et beaucoup plus je suppose

103
jitter
  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 - Aussi Script et API JDBC.
  5. Commander - Annuler/Rétablir TextComponent.
  6. Interprète - RegEx (Java.util.regex .) et SQL (Java.sql.).
  7. Prototype - Je ne suis pas sûr à 100% que cela compte, mais je pense que la méthode clone() peut être utilisée à cette fin.
49
NawaMan

RMI est basé sur le proxy.

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

  1. Abstract Factory: Les interfaces Java.sql obtiennent toutes leurs implémentations concrètes à partir du fichier JAR JDBC lors de l’enregistrement du pilote.
  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 de l'acheter.
  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. Composite: Java.awt. Java.awt.Component + Java.awt.Container
  9. Décorateur: Dans tout le package Java.io.
  10. Façade: ExternalContext se comporte comme une façade permettant d'exécuter des cookies, une étendue 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. Iterator: interface Java.util.Iterator; ne peut pas être plus clair que cela.
  17. Médiateur: JMS?
  18. Mémento:
  19. Observer: Java.util.Observer/Observable (mal fait cependant)
  20. Etat:
  21. Stratégie:
  22. Modèle:
  23. Visiteur:

Je ne peux pas penser aux exemples de Java pour 10 des 23, mais je verrai si je peux faire mieux demain. C'est à quoi sert l'édition.

40
duffymo

Le motif Abstract Factory est utilisé à divers endroits. Par exemple, DatagramSocketImplFactory, PreferencesFactory. Il en existe beaucoup d'autres --- recherchez dans le Javadoc des interfaces portant le mot "Factory" dans leur nom.

En outre, il existe également quelques exemples du motif Factory.

26
uckelman

Bien que je sois en quelque sorte une horloge cassée avec celle-ci, Java API XML 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.

21
Esko

Java.util.Collection # Iterator est un bon exemple de méthode Factory. En fonction de la sous-classe concrète de Collection que vous utilisez, cela créera 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 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 fabrique est réduite et la fabrique utilise d'autres moyens pour choisir le produit à retourner.

  • Usine abstraite

Une fabrique abstraite dispose de plusieurs méthodes, 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 provenir de la même usine (abstraite)). Comme mentionné dans les réponses ci-dessus, les familles de composants d'interface graphique AWT, qui diffèrent d'une plate-forme à l'autre, en sont un exemple (bien que sa mise en œuvre diffère de la structure décrite dans Gof).

20
Catweazle