Ejemplos de patrones de diseño de GoF en las bibliotecas principales de Java

672

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

unj2
fuente

Respuestas:

3229

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 Java SE y Java EE.


Patrones creacionales

Fábrica abstracta (reconocible por métodos de creación que devuelven la propia fábrica que a su vez se puede usar para crear otro tipo de resumen / interfaz)

Generador (reconocible por métodos de creación que devuelven la instancia en sí)

Método de fábrica (reconocible por métodos de creación que devuelven una implementación de un tipo abstracto / interfaz)

Prototipo (reconocible por métodos de creación que devuelve una instancia diferente de sí mismo con las mismas propiedades)

Singleton (reconocible por métodos de creación que devuelven la misma instancia (generalmente de sí mismo) cada vez)


Patrones estructurales

Adaptador (reconocible por métodos de creación que toman una instancia de diferente tipo de resumen / interfaz y devuelven una implementación de otro / abstracto / tipo de interfaz que decora / anula la instancia dada)

Puente (reconocible por métodos de creación que toman una instancia de diferente tipo de resumen / interfaz y devuelven una implementación del propio tipo de resumen / interfaz que delega / usa la instancia dada)

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

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

Decorador (reconocible por métodos de creación que toman una instancia del mismo tipo abstracto / interfaz que agrega un comportamiento adicional)

Fachada (reconocible por métodos de comportamiento que internamente utiliza instancias de diferentes tipos de interfaz / resumen independientes)

Flyweight (reconocible por métodos de creación que devuelven una instancia en caché, un poco la idea "multitono")

Proxy (reconocible por métodos de creación que devuelve una implementación del tipo abstracto / interfaz dado que a su vez delega / usa una implementación diferente del tipo abstracto / interfaz dado)


Patrones de comportamiento

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

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

Intérprete (reconocible por métodos de comportamiento que devuelven una instancia / tipo estructuralmente diferente 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 (reconocible por métodos de comportamiento que devuelven instancias secuencialmente de un tipo diferente de una cola)

Mediador (reconocible por métodos de comportamiento que toman una instancia de diferente tipo abstracto / interfaz (generalmente usando el patrón de comando) que delega / usa la instancia dada)

Memento (reconocible por métodos de comportamiento que cambian internamente el estado de toda la instancia)

Observador (o Publicar / Suscribir) (reconocible por métodos de comportamiento que invoca un método en una instancia de otro tipo de resumen / interfaz, según su propio estado)

Estado (reconocible por métodos de comportamiento que cambian su comportamiento dependiendo del estado de la instancia que se puede controlar externamente)

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

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

Visitante (reconocible por dos tipos de resumen / interfaz diferentes que tienen métodos definidos que toman el otro tipo de resumen / interfaz; el uno llama al método del otro y el otro ejecuta la estrategia deseada en él)

BalusC
fuente
23
impresionante .. :) +1. javax.lang.model.elementdefine a los visitantes;) No estoy muy seguro de si son doXXXy doFilterson "estrategias".
Bozho
16
Los constructores mencionados, por ejemplo, StrinbgBuilder, no son todos un ejemplo para el Patrón de constructor. Sin embargo, es un error muy común considerarlos como constructores (por lo que realmente no tiene la culpa ^ _ ^)
Angel O'Sphere,
77
@ BalusC, tengo una pregunta que hacerle. ¿ Leíste TODO el código fuente de Java y JSF?
Tapas Bose
20
@Tapas: No leí todo, solo partes que necesitaba, o simplemente tenía curiosidad sobre cómo "lo hicieron".
BalusC
77
La mayoría de los ejemplos en "Método de fábrica" ​​son ejemplos de "fábrica estática" que no es un patrón GoF. Incorrecto.
portador del anillo
107
  1. Patrón de observador en todo el swing ( Observable, Observer)
  2. MVC también en swing
  3. Adapter: InputStreamReader y OutputStreamWriter NOTA: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapterson no adaptadores; en realidad son objetos nulos. Mala elección de nombres por parte de Sun.
  4. Patrón de decorador ( BufferedInputStreampuede decorar otras secuencias como FilterInputStream)
  5. Patrón AbstractFactory para AWT Toolkit y las clases de apariencia y sensación conectables de Swing
  6. java.lang.Runtime#getRuntime() es Singleton
  7. ButtonGroup para patrón de mediador
  8. Action, AbstractActionse puede usar para diferentes representaciones visuales para ejecutar el mismo código -> Patrón de comando
  9. Cadenas internas o CellRender en JTable para Flyweight Pattern (también piense en varios grupos: grupos de subprocesos, grupos de conexión, grupos de objetos EJB: Flyweight se trata realmente de la gestión de recursos compartidos)
  10. El modelo de evento Java 1.0 es un ejemplo de Cadena de responsabilidad, al igual que los filtros de servlet.
  11. Patrón de iterador en el marco de colecciones
  12. Los contenedores anidados en AWT / Swing usan el patrón compuesto
  13. Los gerentes de diseño en AWT / Swing son un ejemplo de estrategia

y muchos más supongo

inquietud
fuente
1
Gracias por el consejo sobre MouseAdapter. Encontré esta explicación: stackoverflow.com/questions/9244185/…
Lincoln
Tenga en cuenta que Swing solo se basa libremente en MVC. Se ha colapsado Ver y Controlador en una clase.
Matthias Braun
51
  1. Flyweight 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 secuencias de comandos.
  3. Singleton - java.lang.Runtime viene a la mente.
  4. Abstract Factory : también scripting y API JDBC.
  5. Comando - Deshacer / Rehacer del componente de texto.
  6. Intérprete : RegEx (java.util.regex. ) Y SQL (java.sql. ) API.
  7. Prototipo : no estoy 100% seguro si esto cuenta, pero creo que el clone()método g puede usarse para este propósito
NawaMan
fuente
1
Con respecto al patrón Flyweight : podría ser diferente de Layout Managers java.awty java.swingpaquetes. De hecho, comparten atributos intrínsecos casi idénticos y los atributos extrínsecos son diferentes componentes de la interfaz de usuario que presentan en forma de interfaz de usuario.
Vitaly
@NawaMan Dijiste 5. Comando Deshacer / Rehacer del componente de texto. Creo que es un recuerdo, no un comando. O muy probablemente ambos.
Stimpson Cat
¿Podría ayudarme en una pregunta relacionada? Stackoverflow.com/questions/61284856/… . Utilicé el patrón de comando en este ejemplo simple, pero no estoy seguro de si es la forma correcta de resolver mi problema.
Tom Joe
42

RMI se basa en Proxy.

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

  1. Abstract Factory: todas las interfaces java.sql obtienen sus implementaciones concretas de JDBC JAR cuando se registra el controlador.
  2. Generador: java.lang.StringBuilder.
  3. Método de fábrica: fábricas XML, entre otras.
  4. Prototipo: tal vez clone (), pero no estoy seguro de comprarlo.
  5. Singleton: java.lang.System
  6. Adaptador: Clases de adaptador en java.awt.event, por ejemplo, WindowAdapter.
  7. Puente: 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. Peso mosca: entero, personaje, etc.
  12. Proxy: paquete java.rmi
  13. Cadena de responsabilidad: filtros de servlet
  14. Comando: elementos del menú Swing
  15. Intérprete: No directamente en JDK, pero JavaCC ciertamente lo usa.
  16. Iterador: interfaz java.util.Iterator; No puede ser más claro que eso.
  17. Mediador: JMS?
  18. Recuerdo:
  19. Observador: java.util.Observer/Observable (aunque mal hecho)
  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 está la edición.

duffymo
fuente
28

El patrón Abstract Factory se usa en varios lugares. Por ejemplo, DatagramSocketImplFactory, PreferencesFactory. Hay muchos más: busque en el Javadoc interfaces que tengan la palabra "Fábrica" ​​en su nombre.

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

uckelman
fuente
22

Aunque estoy un poco roto con este, la API XML de Java 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.

Esko
fuente
21

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 Iterator. Debido a que tanto la superclase de Factory (Collection) como el Iterator creados son interfaces, a veces se confunde con AbstractFactory. La mayoría de los ejemplos de AbstractFactory en la respuesta aceptada (BalusC) son ejemplos de Factory , una versión simplificada de Factory Method, que no forma parte de los patrones originales de GoF. En Facory, la jerarquía de clases de Factory se contrae 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 diseñados para usarse juntos (es mejor que su impresora y cartuchos sean de la misma fábrica (abstracta)). Como se menciona en las respuestas anteriores, las familias de 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).

Catweazle
fuente