tipos software patrones patron ejemplos diseño creacionales creacion java hibernate design-patterns spring

java - software - ¿Patrones de diseño que todo desarrollador debe conocer?



patrones de diseño web (11)

¿Cuáles son los patrones de diseño que todo desarrollador debe saber?

Estoy interesado en el contexto de los desarrolladores web de Java que trabajan con Spring & Hibernate. A menudo he escuchado que un buen conocimiento de los patrones de diseño es esencial para trabajar con esos marcos. ¿Alguien puede enumerar los detalles?

Por ejemplo, sé que entender el patrón abstracto de fábrica y fábrica, patrón de singleton, etc. es absolutamente esencial. Estoy buscando una lista completa.


Inversión de control

Si alguna vez va a diseñar sistemas desacoplados, necesitará saber cómo vincular adecuadamente las dependencias entre clases.

Patrón de Comando y Variantes

En Java en particular, es esencial aprender cómo pasar una pieza de funcionalidad a otro método como un objeto debido a la falta de cierres y punteros de función en el lenguaje.

Patrón de fábrica

Las fábricas son ubicuas en los marcos de Java y es esencial aprender por qué y cuándo usar el patrón de fábrica.

Singleton (patrón y anti-patrón)

Aprender a usar el patrón Singleton de manera responsable es muy útil para comprender las dificultades del código de otras personas que puede estar leyendo.

En general, aprender el por qué con respecto a los patrones es mucho más importante que el cómo . Saber cuándo no aplicar un patrón es tan importante como saber cuándo.


¡Todos deberían saber sobre Singleton, pero también cuándo no usarlo! Actualmente es la fuente de mucho dolor para mí en un proyecto en el trabajo.

Singletons hace que el código sea difícil de entender y seguir, y hace que las pruebas de unidad de escritura sean mucho más difíciles. Me gusta la entrada del blog Singletons are Pathological Liars .


¿Hibernar? Entonces, la Unidad de Trabajo es imprescindible http://martinfowler.com/eaaCatalog/unitOfWork.html

Compuesto, está presente en el framework JUnit. (Test-TestCase-TestSuite)

Los patrones de Adaptador, Generador, Comando, Método de Plantilla y Estrategia son fáciles y, a menudo, utilizables en la práctica.

El patrón del estado también me ayudó a limpiar el desorden en los códigos fuente heredados.


Aparte de los patrones Abstract factory , Factory Method y Singleton , que ya ha citado, creo que a continuación los patrones son útiles.

Patrón de puente : la abstracción y la implementación pueden cambiar de forma independiente

Patrón decorador : cambia el comportamiento del objeto en el tiempo de ejecución

Patrón de mediador : habilite el medio de comunicación central entre diferentes objetos

Cadena de responsabilidad : si está agregando filtros a la solicitud de servicio web, esto es muy útil.

Patrón de estrategia : si desea cambiar el algoritmo de una familia de algoritmos en tiempo de ejecución, marque un parámetro

Patrón de fachada : si tiene muchos servicios en su sistema y no desea exponer todos los servicios al cliente, tenga una clase de fachada, que interactúe con otros servicios.

sourcemaking proporciona excelentes detalles sobre cada patrón de diseño: Intención, Estructura, Lista de verificación y Reglas generales.

Una pregunta más de SE sería definitivamente ayudarte:

Patrones de diseño basados ​​en aplicaciones web.


Esto sería un comentario a la referencia de Greg Hewgill a "Singletons Are Pathological Liars", pero todavía no puedo hacer comentarios.

Ese artículo hace un caso convincente, pero su ira está mal dirigida. Como señalaron varios comentaristas en su blog, su problema es realmente un estado global. Su corrección de código aún podría estar haciendo uso de singletons, y aún así obtener el aumento exacto de claridad y comprobabilidad.

Vuelve a leer el artículo. No le molesta que OfflineQueue necesite una instancia de base de datos inicializada, ni que CreditCardProcessor necesite un OfflineQueue inicializado. Le molesta que esas dependencias no sean visibles, lo que causa problemas con la capacidad de mantenimiento y la capacidad de prueba.

Su problema es con el estado global secreto ( ¿esto me hace sonar como un teórico de la conspiración? ).

Sin embargo, está (imo) malinterpretando ese estado global secreto como culpa de singletons.

Eso no significa que estoy a favor de los singletons donde no son necesarios; ciertamente, tienen inconvenientes (incluida la obvia posibilidad de cuellos de botella en la contención del hilo). Pero prefiero tener claro qué prácticas evito.

Por cierto, iría más allá en mi refactorización: según los nombres de las clases, afirmaría en una revisión del código que CreditCardProcessor debería, bueno, procesar los cargos, así que en lugar de él:

card.charge(cardProcessor, 100);

Tendría esto, en cambio:

cardProcessor.chargeCard (card, 100);

(y sí, reemplazé sus nombres de variables c y ccp con nombres que consideré más legibles)


La mayoría de los patrones de diseño son bastante obvios: ya los conoce y los usa si ha estado programando durante algunos años.

La mayor ventaja que he encontrado para diseñar patrones es compartir un conjunto común de nombres. Si alguien dice "Devolución de llamada", eso puede significar bastantes cosas, pero si alguien dice "Patrón de escucha", eso significa un conjunto de llamadas más específico e implica una relación de mayor nivel entre los objetos.

Así que, en esencia, lea un buen libro de patrones de diseño, tenga una idea del nombre de cada patrón, dedique un tiempo a comprender lo que no sabe y estará listo.

No ignoraría completamente a ninguno de ellos, todos son buenos haberlos visto. Debería poder reconocer una situación que podría beneficiarse de un patrón específico y saber dónde buscar para obtener más información al respecto.


Le recomendaría que obtenga y lea el libro Patrones de diseño, ya que le proporciona el vocabulario.




Singleton - Singletons aparentemente puede y debe usarse para todo


Te recomiendo leer el libro Head First Design Patterns . Este es un libro bien escrito sobre todos los bienes comunes y patrones útiles.