Design Patterns: Cuántos son, beneficios y cuáles son los mejores

13/06/2023 Autor: Rafael Gallegos 12 min de lectura
¡Comparte!

Los Design Patterns son soluciones generalistas para problemas que surgen de una manera recurrente a lo largo del desarrollo de Software. Es decir, son soluciones listas, pensadas, probadas y aprobadas para situaciones comunes y que surgen en el día a día.

Piensa en cuando eras niño y jugaste un videojuego por primera vez. Como con cualquier reto nuevo, te tomó mucho tiempo avanzar en cada etapa y pasar a la siguiente. La segunda o tercera vez fue un poco más rápido porque ya estabas familiarizado con la interface y el lenguaje del juego, incluso tenías amigos que también lo jugaron y con quienes intercambiaste tips para obtener mejores resultados y, definitivamente, mientras más lo jugabas, más hábil te volvías y llegaste al punto de descubrir atajos para llegar a la meta mucho más rápido con mayor puntaje.

Es altamente posible que luego de volverte fan de un videojuego, buscaste otros de la misma categoría para seguir probando las habilidades que ganaste y, encontraste ciertas relaciones o similitudes con el videojuego anterior que te permitieron dominar el nuevo más rápido y con mejores resultados.

Los Design Patterns funcionan de una forma parecida a los ejemplos anteriores. En palabras sencillas son soluciones preestablecidas para problemas comunes que los desarrolladores de Software reutilizan para crear mejores productos siguiendo las mejores prácticas sin tener que comenzar o inventar algo desde 0.

En esta guía te explicaremos ¿Qué es un patrón de diseño? y aprenderás a diferenciar entre sus 23 tipos, además de conocer sus beneficios. 

¿Qué es un Design Pattern en Ingeniería de Software?

En palabras simples, los Design Patterns son soluciones generalistas para problemas que surgen de una manera recurrente a lo largo del desarrollo de Software. Es decir, son soluciones listas, pensadas, probadas y aprobadas para situaciones comunes y que surgen en el día a día.

El término Patrones de Diseño está muy relacionado con la Arquitectura e Ingeniería de Software y conectado al paradigma de la orientación a objetos.

Estas soluciones son muy importantes en la formación de un programador, pues elimina la necesidad de reinventar respuestas a todo momento. Basta saber aplicar uno de los Design Patterns en la arquitectura de tu código para estar seguro de que cualquier problema será solucionado.

¿Cuándo surgieron los Design Patterns?

Los Design Patterns surgieron durante las experiencias de los proyectos de softwares, principalmente después de la adopción en masa de la programación orientada a objetos. Incluso, casi todo en la ingeniería de software surgió a partir de los experimentos y continúa evolucionando.

Los Design Patterns se dieron a conocer cuando los ingenieros de software Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides decidieron establecer y catalogar todos los problemas comunes y las formas de solucionarlos.

En 1994, ellos lanzaron el libro “Design Patterns: Elements of Reusable Object – Oriented Software”, que se convirtió en una especie de biblia sobre este asunto.

El cuarteto se hizo conocido como “Gang of Four” o, simplemente GoF.

¿Cuáles son los 3 Tipos de Design Patterns?

Hay 23 Design Patterns clásicos, aunque hay al menos 26 Design Patterns descubiertos hasta la fecha. 

Los Design Patterns se pueden dividir en tres tipos, organizados por su intención en Design Patterns de Creación, Design Patterns Estructurales y Design Patterns de Comportamiento.

Tipos-de-Design-Patterns

1. Design Patterns Creativos

Un patrón de diseño creativo se ocupa de la creación e inicialización de objetos, proporcionando orientación sobre qué objetos se crean para una situación determinada. Estos Design Patterns se utilizan para aumentar la flexibilidad y reutilizar el código existente.

  • Factory Method: Crea objetos con una interfaz común y permite que una clase difiera la creación de instancias a las subclases.

  • Abstract Factory: Crea una familia de objetos relacionados.

  • Builder: Un patrón paso a paso para crear objetos complejos, separando construcción y representación.

  • Prototype: Admite la copia de objetos existentes sin que el código se vuelva dependiente de las clases.

  • Singleton: Restringe la creación de objetos para una clase a una sola instancia.

2. Design Patterns Estructurales

Un patrón de diseño estructural se ocupa de la composición de clases y objetos, o de cómo ensamblar objetos y clases en estructuras más grandes.

  • Adopter: Cómo cambiar o adaptar una interfaz a la de otra clase existente para permitir que las interfaces incompatibles funcionen juntas.

  • Bridge: Un método para desacoplar una interfaz de su implementación.

  • Compuesto: aprovecha una estructura de árbol para admitir la manipulación como un solo objeto.

  • Composite: Extiende dinámicamente (agrega o anula) la funcionalidad.

  • Facade: Define una interfaz de alto nivel para simplificar el uso de una gran cantidad de código.

  • Flyweight: Minimice el uso de la memoria compartiendo datos con objetos similares.

  • Proxy: Cómo representar un objeto con otro objeto para habilitar el control de acceso, reducir costos y reducir la complejidad.

3. Design Patterns de Comportamiento

Un patrón de diseño de comportamiento se ocupa de la comunicación entre los objetos y cómo se asignan las responsabilidades entre los objetos.

  • Chain of Responsability: Un método para delegar comandos a una cadena de objetos de procesamiento.

  • Command: Encapsula una solicitud de comando en un objeto.

  • Interpreter: Admite el uso de elementos de lenguaje dentro de una aplicación.

  • Iterator: Admite el acceso iterativo (secuencial) a los elementos de la colección.

  • Mediator: Articula comunicación simple entre clases.

  • Memento: Un proceso para guardar y restaurar el estado interno/original de un objeto.

  • Observer: Define cómo notificar a los objetos los cambios en otros objetos.

  • State: Cómo alterar el comportamiento de un objeto cuando cambia su etapa.

  • Strategy: Encapsula un algoritmo dentro de una clase.

  • Visitor: Define una nueva operación en una clase sin realizar cambios en la clase.

  • Template Method: Define el esqueleto de una operación al tiempo que permite que las subclases refinen ciertos pasos.

¿Cuál es la importancia de los Design Patterns?

Los Design Patterns se concentran en la reutilización de las soluciones. A pesar de que todos los problemas no sean iguales, si los divides y encuentras similitudes con los que ya fueron resueltos anteriormente, es posible aplicar los Design Patterns y obtener soluciones.

Pero, ¿por qué los programadores deben preocuparse por utilizar Design Patterns?

Porque los softwares cambian, por lo que requieren de mantenimiento y evolución constantes. Es verdad que proyectar softwares que sean de calidad, y principalmente, reutilizables, no es una tarea fácil; pero los Design Patterns están justamente para facilitar esta actividad.

Además, con ellos, es más simple leer un código ajeno. En la etapa de desarrollo, es común que sean creadas soluciones específicas. Sin embargo, crear las generalizaciones puede soportar el trabajo de todos; y por este motivo, la comprensión del código de los otros desarrolladores se vuelve mucho más fácil.

Una vez que tienes la experiencia de aplicar los Design Patterns, las soluciones ganan un patrón ya probado y aprobado por el mercado, además de que son usados por los mejores profesionales del mundo.

¿Cuáles son los Beneficios de utilizar estos Patrones?

Como los modelos ya han sido utilizados y probados, estos representan una ganancia de productividad para los desarrolladores. Esto porque evita que se desperdicien tiempo y energía para solucionar problemas comunes.

  • Soluciones comprobadas

Los Design Patterns brindan una solución comprobada y confiable para un problema común, lo que significa que el desarrollador de software no tiene que "reinventar la rueda" cuando ocurre ese problema.

  • Son reutilizables

Los Design Patterns se pueden modificar para resolver muchos tipos de problemas, no están vinculados a un solo problema.

  • Evitan la necesidad de refactorizar el código

Dado que el patrón de diseño ya es la solución óptima para el problema, esto puede evitar la refactorización.

  • Reducen el tamaño de la base de código

Cada patrón ayuda a los desarrolladores de software a cambiar la forma en que funciona el sistema sin un rediseño completo. Además, como solución "óptima", el patrón de diseño a menudo requiere menos código.

Los 7 mejores Design Patterns

Aunque hay 23 Design Patterns enumerados, hay 7 que se consideran los más influyentes. Aquí describiremos los 7 mejores Design Patterns de software, por qué son importantes y cuándo usarlos.

1. Singleton 

El patrón de diseño Singleton cae dentro del tipo "Design Pattern Creativos", restringiendo la creación de objetos para una clase a una sola instancia y brindando acceso global a una variable global. 

Por ejemplo, muchos desarrolladores web bloquean el "Mapa del Sitio" en una sola versión que tiene un alcance global. Además, otros patrones, como el Factory Method, el Builder y el Prototype, pueden usar Singletons. Los objetos de Facade y State también suelen ser Singletons.

Si bien es posible que solo tenga o necesite una instancia de una clase, esto no significa necesariamente que sea el momento de usar un patrón Singleton para bloquear ese objeto o forzarlo a un estado global. Los Singletons son un patrón de diseño controvertido, y algunos incluso argumentan que los Singletons son un antipatrón que debe evitarse porque encerrar un objeto restringe la flexibilidad futura.

Design Pattern- Singleton

2. Factory Method 

En el Factory Method, un patrón de diseño de "creación", los desarrolladores crean objetos con una interfaz común pero permiten que una clase difiera la creación de instancias a las subclases. El método de fábrica promueve el acoplamiento flexible y la reutilización de código, un "Builder virtual" que funciona con cualquier clase que implemente la interfaz y permite una mayor libertad para que las subclases elijan los objetos que se crean. Cuando se necesitan nuevas clases, se pueden agregar a la fábrica.

Este patrón no es apropiado para escenarios simples, una instancia en la que los desarrolladores se arriesgan a complicar demasiado los procesos para usar un patrón de diseño.

Design Pattern- Factory Method

3. Facade 

El patrón de diseño Facade es del tipo "Design Pattern Estructurales" que ayudan a proporcionar una interfaz (clase) para acceder a una gran cantidad de código/varios objetos. 

Contiene en una fachada oculta complejidades de varios subsistemas (a menudo organizados en una clase) con una interfaz simple. Por ejemplo, un cliente de comercio electrónico solo quiere un punto de interacción con una marca, en lugar de comunicarse individualmente (interconectarse) con cada sistema para respaldar la venta, como inventario de productos, autenticación, seguridad, procesamiento de pagos, cumplimiento de pedidos, etc. 

En este caso, Facade ha encapsulado todas las actividades y sistemas de "pedido" para proporcionar una interfaz única: el cliente permanece completamente inconsciente de lo que sucede detrás de escena. 

Design Pattern- Facade

4. Strategy 

Este patrón de diseño es del tipo "Design Pattern de Comportamiento". En el patrón de estrategia, los algoritmos intercambiables se encapsulan juntos en una "familia" y uno de los algoritmos se selecciona en tiempo de ejecución según sea necesario. Por ejemplo, una familia de algoritmos puede estar relacionada con la "clasificación" de productos en un sitio web de comercio electrónico: por tamaño, color, premio, etc. La estrategia se implementa en función de las acciones del cliente.

Este patrón es increíblemente poderoso en las estrategias de marketing de personalización, ya que responde a la ubicación, las entradas o las acciones del cliente para brindar una experiencia diferente a cada usuario.

Design Pattern- Strategy

5. Observer 

El patrón de diseño Observer es del tipo "Design Pattern de Comportamiento", vinculando un objeto (sujeto) a dependientes (observadores) en un patrón de uno a muchos. Cuando alguno de los observadores cambia, se notifica al sujeto. 

El patrón de diseño Observer es útil en cualquier tipo de programación basada en eventos, como notificar a un usuario de un nuevo comentario en Facebook, enviar un correo electrónico cuando se envía un artículo, etc.

Design Pattern- Observer

6. Builder

El patrón de diseño Builder es del tipo “Design Pattern Creacional”, separando la construcción del objeto de la representación. Este patrón de diseño permite un mayor control sobre el proceso de diseño (más paso a paso), pero también desacopla la representación para admitir múltiples representaciones de un objeto utilizando el mismo código de construcción base (el paso ConcreteBuilder).

Este patrón se ejecuta en pasos secuenciales a medida que se construye el objeto, llamando solo a los pasos que son necesarios para cada iteración del objeto.

Design Pattern- Builder

7. Adapter

El patrón de diseño del adaptador es un "envoltorio" que convierte un tipo de interfaz en otro tipo de interfaz existente. El patrón de diseño Adapter ayuda a que las clases funcionen juntas cuando son incompatibles, lo que permite que el código funcione en conjunto. 

Estos patrones son útiles para tomar interfaces mixtas y convertirlas en una API coherente.

Design Pattern- Adapter

LA EXPERIENCIA HACE AL MAESTRO

En Ingeniería de Software, existen ventajas y desventajas en el uso de Design Patterns de software. Saber cuándo usar Design Patterns de software, y cuándo no, y cuál es la mejor manera de implementar cada patrón se reduce a tener un equipo experimentado que sepa identificar cada problema y asociarlo a una solución que cada Desig Pattern pueda ofrecer.


Te recomendamos leer...