tipos patrones patron estructurales ejemplos diseño creacional comportamiento java oop design-patterns java-api

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



patrones de diseño java ejemplos (7)

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


  1. Patrón de observador en 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 no son adaptadores; En realidad son objetos nulos. Mala elección de nombres por parte de Sun.
  4. Patrón decorador ( BufferedInputStream puede decorar otras transmisiones como FilterInputStream )
  5. Patrón AbstractFactory para el AWT Toolkit y las clases de apariencia interactiva Swing
  6. java.lang.Runtime#getRuntime() es Singleton
  7. ButtonGroup de ButtonGroup para patrón de mediador
  8. Action , AbstractAction se puede usar para diferentes representaciones visuales para ejecutar el mismo código -> Patrón de comando
  9. Cadenas internadas o CellRender en JTable para Flyweight Pattern (también piense en varias agrupaciones - agrupaciones de hebras, agrupaciones de conexiones, agrupaciones de objetos EJB - Flyweight realmente trata sobre la gestión de recursos compartidos)
  10. El modelo de eventos Java 1.0 es un ejemplo de Cadena de Responsabilidad, al igual que los Filtros de Servlets.
  11. Patrón de iterador en el marco de colecciones
  12. Los contenedores anidados en AWT / Swing usan el patrón Compuesto
  13. Los gestores de diseño en AWT / Swing son un ejemplo de estrategia

y muchos más supongo


  1. El peso mosca se usa con algunos valores de Byte, Short, Integer, Long y String.
  2. La fachada se usa en muchos lugares, pero la más obvia 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 - TextComponent''s Undo / Redo.
  6. Intérprete - RegEx (java.util.regex. ) Y SQL (java.sql. ) API.
  7. Prototipo : no estoy seguro al 100% de este recuento, pero creo que el método clone() se puede utilizar para este propósito.

A pesar de que con este tipo de reloj no funciona, Java API de Java usa mucho Factory. Me refiero a mirar 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) utilizan Builder.


El patrón de Abstract Factory se utiliza en varios lugares. Por ejemplo, DatagramSocketImplFactory , PreferencesFactory . Hay muchos más --- busque en el Javadoc las interfaces que tienen la palabra "Factory" en su nombre.

También hay bastantes instancias del patrón de Fábrica, también.


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í y trataré de asignar tantas implementaciones de patrones como sea posible, que se encuentran tanto en las API de Java SE como en las de Java EE.

Patrones creacionales

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

Builder (reconocible por métodos creacionales que devuelven la instancia en sí)

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

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

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

Patrones estructurales

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

Bridge (reconocible por métodos de creación que toman una instancia de diferente tipo de interfaz / resumen y devuelven una implementación de tipo de interfaz / resumen propio 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 utiliza . Sin embargo, los métodos java.util.Collections#newSetFromMap() y singletonXXX() se acercan.

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

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

Facade (reconocible por métodos de comportamiento que utilizan internamente 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 "multiton")

Proxy (reconocible por métodos de creación que devuelve una implementación del tipo de interfaz / resumen dado que a su vez delega / usa una implementación diferente del tipo de interfaz / resumen 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 de interfaz / resumen en una cola)

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

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

Iterator (reconocible por métodos de comportamiento que devuelven secuencialmente instancias de un tipo diferente de una cola)

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

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

Observador (o publicación / suscripción) (reconocible por métodos de comportamiento que invoca un método en una instancia de otro tipo de interfaz / resumen, dependiendo del estado propio)

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

Strategy (reconocible por métodos de comportamiento en un tipo de interfaz / resumen que invoca un método en una implementación de un tipo de interfaz / resumen diferente que se ha introducido 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)

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


RMI se basa en Proxy.

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

  1. Fábrica abstracta: todas las interfaces java.sql obtienen sus implementaciones concretas de JDBC JAR cuando se registra el controlador.
  2. Constructor: java.lang.StringBuilder.
  3. Método de fábrica: fábricas de XML, entre otras.
  4. Prototipo: tal vez clone (), pero no estoy seguro de que esté comprando eso.
  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: Todo sobre el paquete java.io.
  10. Fachada: ExternalContext comporta como una fachada para realizar cookies, alcance de sesión y operaciones similares.
  11. Peso de mosca: Entero, personaje, etc.
  12. Proxy: paquete java.rmi
  13. Cadena de Responsabilidad: Filtros de Servlets.
  14. Comando: Swing elementos de menú
  15. Intérprete: no directamente en JDK, pero JavaCC ciertamente usa esto.
  16. Iterator: java.util.Iterator interface; no puede ser más claro que eso
  17. Mediador: JMS?
  18. Recuerdo:
  19. Observer: 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.


java.util.Collection # Iterator es un buen ejemplo de un método de fábrica. Dependiendo de la subclase concreta de la Colección que utilice, creará una implementación de Iterador. Debido a que tanto la superclase de Fábrica (Colección) como el Iterador 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 Factory , una versión simplificada de Factory Method, que no forma parte de los patrones originales de GoF. En Facory, la jerarquía de clase de Fábrica está colapsada y la fábrica utiliza otros medios para elegir el producto a 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 (resumen)). Como se mencionó en las respuestas anteriores, las familias de componentes 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).