Pregunta Ejemplos de patrones de diseño GoF en las bibliotecas centrales de Java


Estoy aprendiendo GoF Java Design Patterns y quiero ver algunos ejemplos de vida real de ellos. ¿Cuáles son algunos buenos ejemplos de estos patrones de diseño en las bibliotecas centrales de Java?


673


origen


Respuestas:


Puede encontrar una descripción general de muchos patrones de diseño en Wikipedia. También menciona qué patrones son mencionados por GoF. Los resumiré aquí e intentaré asignar tantas implementaciones de patrones como sea posible, que se encuentran en las API de Java EE y Java EE.


Patrones creacionales

Fábrica abstracta  (Se puede reconocer mediante métodos creacionales que devuelven la propia fábrica, lo que a su vez puede usarse para crear otro tipo de resumen / interfaz)

Constructor  (Se puede reconocer mediante métodos creacionales que devuelven la instancia en sí)

Método de fábrica  (Se puede reconocer mediante métodos creacionales que devuelven una implementación de un tipo abstracto / de interfaz)

Prototipo  (reconocible por métodos creativos que devuelven diferente instancia de sí mismo con las mismas propiedades)

Semifallo  (reconocible por métodos creacionales que devuelven mismo instancia (generalmente de sí mismo) cada vez)


Patrones estructurales

Adaptador  (reconocible por métodos creativos tomando una instancia de diferente tipo abstracto / interfaz y devolver una implementación de tipo de interfaz / interfaz propio / otro que decora / sobrescribe la instancia dada)

Puente  (reconocible por métodos creativos tomando una instancia de diferente tipo abstracto / de interfaz y devolver una implementación de tipo propio abstracto / de interfaz que delegados / usos la instancia dada)

  • Ninguno viene a la mente todavía. Un ejemplo ficticio sería new LinkedHashMap(LinkedHashSet<K>, List<V>) que devuelve un mapa vinculado no modificable que no clona los elementos, pero usos ellos. los java.util.Collections#newSetFromMap() y singletonXXX() métodos sin embargo se acerca.

Compuesto  (reconocible por métodos de comportamiento tomando una instancia de mismo tipo abstracto / interfaz en una estructura de árbol)

Decorador  (reconocible por métodos creativos tomando una instancia de mismo tipo abstracto / interfaz que agrega un comportamiento adicional)

Fachada  (reconocible por métodos de comportamiento que internamente usa instancias de diferente tipos abstractos / de interfaz independientes)

Peso mosca  (Se puede reconocer mediante métodos creacionales que devuelven una instancia en caché, un poco la idea de "multitón")

Apoderado  (Se puede reconocer mediante métodos creacionales que devuelve una implementación de un tipo de interfaz / resumen dado que a su vez delegados / usos un diferente implementación del tipo abstracto / interfaz dado)


Patrones de comportamiento

Cadena de responsabilidad  (reconocible por métodos conductuales que (indirectamente) invoca el mismo método en otro implementación de mismo tipo abstracto / interfaz en una cola)

Mando  (reconocible por métodos de comportamiento en un tipo abstracto / de interfaz que invoca un método en una implementación de un diferente tipo abstracto / interfaz que ha sido encapsulado por la implementación del comando durante su creación)

Interprete  (reconocible por métodos conductuales que devuelven estructuralmente diferente instancia / tipo de la instancia / tipo dado; tenga en cuenta que el análisis / formateo no es parte del patrón, determinar el patrón y cómo aplicarlo es)

Iterador  (que se puede reconocer mediante métodos de comportamiento que devuelven secuencialmente instancias de diferente escriba desde una cola)

Mediador  (Se puede reconocer mediante métodos de comportamiento tomando una instancia de diferente tipo abstracto / interfaz (usualmente usando el patrón de comando) que delega / usa la instancia dada)

Recuerdo  (reconocible por métodos de comportamiento que cambia internamente el estado de todo ejemplo)

Observer (o Publish / Subscribe)  (reconocible por métodos de comportamiento que invoca un método en una instancia de otro tipo abstracto / interfaz, dependiendo del propio estado)

Estado  (reconocible por métodos de comportamiento que cambia su comportamiento dependiendo del estado de la instancia que puede controlarse externamente)

Estrategia  (reconocible por métodos de comportamiento en un tipo abstracto / de interfaz que invoca un método en una implementación de un diferente tipo abstracto / interfaz que ha sido aprobada en como argumento de método en la implementación de la estrategia)

Método de plantilla  (reconocible por métodos conductuales que ya tienen un comportamiento "predeterminado" definido por un tipo abstracto)

Visitante  (reconocible por dos diferente tipos abstract / interface que tiene métodos definidos que toman cada uno otro tipo abstracto / interfaz; uno realmente llama al método del otro y el otro ejecuta la estrategia deseada sobre él)


2843



  1. Patrón de observador durante todo el swing (Observable, Observer)
  2. MVC también en swing
  3. Patrón de adaptador: InputStreamReader y OutputStreamWriter  NOTA: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapter son no adaptadores; en realidad son objetos nulos. Pobre elección de nombres por Sun.
  4. Patrón de decorador (BufferedInputStream puede decorar otras secuencias como FilterInputStream)
  5. AbstractFactory Pattern para AWT Toolkit y las clases de apariencia y efecto Swing Swing
  6. java.lang.Runtime#getRuntime() es Singleton
  7. ButtonGroup para el patrón de Mediator
  8. Action, AbstractAction se puede usar para diferentes representaciones visuales para ejecutar el mismo código -> Patrón de comando
  9. Interned Strings o CellRender en JTable for Flyweight Pattern (También piense en varias agrupaciones: grupos de subprocesos, grupos de conexiones, grupos de objetos EJB, Flyweight realmente trata sobre la administración de recursos compartidos)
  10. El modelo de evento de Java 1.0 es un ejemplo de Cadena de responsabilidad, al igual que los Servlets Filters.
  11. Patrón iterador en el marco de colecciones
  12. Los contenedores anidados en AWT / Swing usan el patrón Compuesto
  13. Los administradores de diseño en AWT / Swing son un ejemplo de estrategia

y muchos más, supongo


97



  1. Peso mosca se usa con algunos valores de Byte, Short, Integer, Long y String.
  2. Fachada se usa en muchos lugares, pero lo más obvio son las interfaces de scripting.
  3. Semifallo - java.lang.Runtime viene a la mente.
  4. Fábrica abstracta - También secuencias de comandos y API JDBC.
  5. Mando - Deshacer / Rehacer de TextComponent.
  6. Interprete - RegEx (java.util.regex.) y SQL (java.sql.) API.
  7. Prototipo - No estoy 100% seguro si este conteo, pero creo clone() método puede ser utilizado para este fin.

48



RMI se basa en Proxy.

Debería ser posible citar uno para la mayoría de los 23 patrones en GoF:

  1. Abstract Factory: las interfaces java.sql obtienen todas sus implementaciones concretas de JDBC JAR cuando el controlador está registrado.
  2. Constructor: java.lang.StringBuilder.
  3. Método de fábrica: fábricas XML, entre otros.
  4. Prototipo: tal vez clonar (), pero no estoy seguro de que compre eso.
  5. Singleton: java.lang.System
  6. Adaptador: clases de adaptador en java.awt.event, p. Ej., WindowAdapter.
  7. Bridge: clases de colección en java.util. Lista implementada por ArrayList.
  8. Compuesto: java.awt. java.awt.Component + java.awt.Container
  9. Decorador: en todo el paquete java.io
  10. Fachada: ExternalContext se comporta como una fachada para realizar cookies, alcance de sesión y operaciones similares.
  11. Flyweight: entero, personaje, etc.
  12. Proxy: paquete java.rmi
  13. Cadena de responsabilidad: filtros de servlets
  14. Comando: elementos del menú Swing
  15. Intérprete: No directamente en JDK, pero JavaCC ciertamente usa esto.
  16. Iterador: interfaz java.util.Iterator; no puede ser más claro que eso.
  17. Mediador: JMS?
  18. Recuerdo:
  19. Observer: java.util.Observer/Observable (mal hecho, sin embargo)
  20. Estado:
  21. Estrategia:
  22. Modelo:
  23. Visitante:

No puedo pensar en ejemplos en Java para 10 de los 23, pero veré si puedo hacerlo mejor mañana. Para eso es la edición.


39



El patrón Abstract Factory se usa en varios lugares. P.ej., DatagramSocketImplFactory, PreferencesFactory. Hay muchos más: busque el Javadoc para las interfaces que tienen la palabra "Factory" en su nombre.

También hay bastantes instancias del patrón Factory, también.


26



Aunque soy una especie de reloj roto con este, Java XML API usa mucho Factory. Quiero decir solo mira esto:

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

...y así sucesivamente y así sucesivamente.

Además, varios Buffers (StringBuffer, ByteBuffer, StringBuilder) usan Builder.


20



java.util.Collection # Iterator es un buen ejemplo de un método de fábrica. Dependiendo de la subclase concreta de Colección que use, creará una implementación de iterador. Debido a que tanto la superclase Factory (Collection) como el Iterator creado son interfaces, a veces se confunde con AbstractFactory. La mayoría de los ejemplos de AbstractFactory en la respuesta aceptada (BalusC) son ejemplos de Fábrica, una versión simplificada de Factory Method, que no forma parte de los patrones originales de GoF. En Facory, la jerarquía de clase Factory está contraída y la fábrica utiliza otros medios para elegir el producto que se devolverá.

  • Fábrica abstracta

Una fábrica abstracta tiene múltiples métodos de fábrica, cada uno creando un producto diferente. Los productos producidos por una fábrica están destinados a ser utilizados en conjunto (la impresora y los cartuchos deben ser mejores de la misma fábrica (abstracta)). Como se menciona en las respuestas anteriores, las familias de los componentes de AWT GUI, que difieren de una plataforma a otra, son un ejemplo de esto (aunque su implementación difiere de la estructura descrita en Gof).


19