PATRONES DE DISEÑO

Si estás buscando información sobre cómo implementar patrones de diseño y mejorar en las buenas practicas de programacion esta guía actualizada te ayudará

Introducción – Patrones de diseño

A lo largo de nuestra carrera como programadores muchas veces nos vemos en la tarea de escribir nuevos sistemas informáticos desde cero, sin embargo, a medida que avanzamos en el desarrollo del diseño los problemas suelen repetirse, es por esto que, en 1994 un grupo de investigación en ingeniería de software conocido como GoF (Gang of Four) expone la idea de pensar la resolución de problemas como patrones de diseño.

Gracias a los avances que Erich Gamma, John Vlissides, Ralph Johnson y Richard Helm, han compartido dentro del libro Design Patters, Elements Of Reusable Object-Oriented Software hoy podemos comprender y atacar los problemas de diseño desde una perspectiva diferente.

¿Qué son los patrones de diseño y porque debemos usarlos?

Los patrones de diseño (design patterns) son elementos reutilizables creados para resolver problemas comunes. Es decir que con su aplicación y utilización podremos corregir diferentes problemas que presenta nuestro código de una manera segura, estable y testeada por cientos de programadores de todo el mundo.

 

¿Cuándo usar patrones de diseño?

Antes que nada, es importante aclarar que para utilizar este tipo de soluciones debemos conocer en profundidad el sistema que estamos desarrollando, así como también el problema que queremos abordar.

La experiencia práctica nos dará las directrices para conocer si es adecuado utilizar uno u otro patrón de diseño a la hora de solucionar un problema particular.

Siempre que tengas problemas que en la práctica sean recurrentes puedes implementar patrones de diseño, pero evita soluciones que te obliguen a adaptar tu código a dicho patrón, ya que esto no es una buena práctica.

Al utilizar patrones de diseño es importante considerar también si el rendimiento de nuestros sistemas se verá afectado cuando apliquemos la solución, ya que algunos patrones de diseño incorporan complejidades en el código que pueden perjudicar el desempeño de nuestros programas.

¿Qué errores puedo resolver utilizando patrones de diseño?

Existe un gran número de problemas que podemos resolver aplicando patrones de diseño y cada uno de ellos puede estar relacionado con un tipo de patrón diferente, es por eso que se recomienda aplicar estas soluciones bajo un ojo crítico siempre y cuando sean estrictamente necesarias.

Para conocer más acerca de los errores que podemos corregir utilizando patrones de diseño puedes leer el libro Head First Design Patterns, 2nd Edition de Eric Freeman y Elisabet Robson.

Tipos de patrones de diseño

Según el tipo de problemas que resuelven, los patrones de diseño se clasifican en 3 categorías:

5.1 Patrones creacionales

Estos patrones se utilizan para facilitar la creación de nuevos objetos que buscan incrementar la flexibilidad y reutilización del código existente. Entre los más utilizados podemos nombrar:

Abstract Factory: Este patrón se utiliza para crear familias de objetos que se relacionan sin la necesidad de especificar sus clases.

Builder Patterns: El patrón constructor se utiliza para crear diferentes objetos a partir de una serie de pasos reutilizando el código de construcción. Esto simplifica la necesidad de crear subclases para cada configuración posible de un objeto particular.

Factory Method: Este patrón ofrece una interfaz para crear nuevos objetos dentro de una superclase permitiendo que las subclases cambien el tipo de objetos que van a crear.

Prototype: Se utiliza para crear nuevos objetos a partir de objetos existentes. A través de la declaración de una interfaz (clonar) este patrón encarga a los propios objetos la acción de clonarse.

Singleton: Se utiliza para restringir la creación de nuevas instancias de una clase a un objeto determinado.

            

5.2 Patrones estructurales

Los patrones estructurales buscan facilitar la acción de ensamblar objetos y clases dentro de clases estructurales más grandes sin perder la eficiencia y manteniendo la flexibilidad.

Adapter: Adaptador es un patrón que se utiliza para que objetos con interfaces incompatibles colaboren entre sí.

Bridge: El patrón Bridge resuelve un problema habitual en la herencia de clases dividiendo clases relacionadas en dos jerarquías diferentes: implementación y abstracción, para que estas puedan desarrollarse independientemente.

Composite: Solo se recomienda utilizar Composite cuando el modelo de código está creado a partir de un sistema ramificado en forma de árbol.

Decorator: Se utiliza para extender el comportamiento de un objeto añadiendo funcionalidades al mismo a través de objetos encapsuladores que presentan dichas funcionalidades.

Facade: Una fachada proporciona una interfaz simplificada para un subsistema complejo. Por ejemplo, este patrón de diseño permite integrar una aplicación con una biblioteca que tiene muchas funciones de las que solo se ocupan unas pocas.

Flyweight: Ayuda a reducir el tamaño de los objetos almacenando en su interior solo el estado intrínseco (información constante) del mismo y compartiendo el resto de la información (estado extrínseco) entre varios objetos similares.

Proxy: Este patrón de diseño se utiliza para crear objetos sustitutos que trabajan como una interfaz hacia cualquier objeto determinado.

 

5.3 Patrones de comportamiento

Los patrones de comportamiento buscan resolver la comunicación entre diferentes áreas

Chain of responsibility: A través de este patrón podremos evitar que la petición emitida por un emisor sea acoplada a un solo receptor permitiendo que más de un objeto pueda responder a dicha petición.

Command Se utiliza cuando es necesario encapsular dentro de un objeto todos los parámetros que una acción requiere para ejecutarse.

Interpreter: Utilizando Interpreter podremos evaluar un lenguaje a través de una interfaz que indique el contexto en el cual se interpreta.

Iterator: Este patrón de comportamiento se utiliza cuando necesitamos iterar en colecciones o conjuntos de objetos sin la necesidad de intercambiar información relevante.

Mediator: Se utiliza cuando necesitamos controlar las comunicaciones directas entre objetos y disminuir sus dependencias caóticas.

Memento: Este patrón es capaz de almacenar y restaurar la información de un objeto.

Observer: A través de este patrón de comportamiento varios objetos interesados (suscriptores) en un objeto en particular (notificador) pueden recibir notificaciones de su comportamiento mientras estén suscriptos a sus notificaciones.

State: Se utiliza para modificar el comportamiento de una clase de objetos dependiendo del estado actual (comportamiento interno) de dichos objetos.

Strategy: Permite separar todos los algoritmos de una clase específica en nuevas clases separadas donde los objetos pueden intercambiarse.

Template method: Este patrón define el esqueleto de un algoritmo y permite a las subclases variar la implementación del comportamiento del mismo.

Visitor: A través de este patrón podremos introducir nuevos algoritmos sin modificar la estructura de objetos que se utilizarán para ejecutarlos.

Conclusión 

Ahora que ya sabes que no tienes que volver a inventar la rueda si deseas corregir un error de diseño o mejorar la estructura interna del código de tu aplicación te recomendamos que lleves a la práctica la implementación de los patrones de diseño en forma metódica para que puedas mejorar e impulsar tu código al próximo nivel. 

Descubre más acerca de las buenas prácticas en programación en nuestra web.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad