Patrones de diseño y su clasificación

Oscar Erazo
Condor Labs Engineering
7 min readAug 10, 2022

Un patrón de diseño nos permite resolver problemas con soluciones estandarizadas, y por lo tanto mejorar el desarrollo ya que existe una solución establecida o una posible solución a problemas comunes en el desarrollo de aplicaciones. Se pueden resumir como “una manera de resolver una problemática”.

Al utilizar patrones de diseño debemos tener en cuenta no excedernos en su uso ya que esto podría volverse en nuestra contra aumentando la complejidad de nuestro software.

¿Cuántos patrones de diseño existen?

Patrones de diseño hay demasiados y con el tiempo han aparecido nuevos patrones, por ende es imposible conocer todos los patrones disponibles en la actualidad. Pero a pesar de la gran cantidad de patrones que existen, todos se pueden clasificar dentro de estos tres grandes grupos:

  1. Patrones creacionales: Utilizados para instanciar objetos, y así separar la implementación del cliente de los objetos que se utilizan. Con ellos intentamos separar la lógica de creación de objetos y encapsularla.
  2. Patrones de comportamiento: Se utilizan a la hora de definir cómo las clases y objetos interactúan entre sí.
  3. Patrones estructurales o de estructura: Utilizados para crear clases u objetos incluidos dentro de estructuras más complejas.

A continuación se presentan algunos de los patrones de diseño mas usados, los cuales están clasificados dentro de estos tres grandes grupos.

Patrones creacionales

Dentro de este tipo podemos encontrar los siguientes.

  1. Patrón Constructor

Este patrón se utiliza para encapsular la construcción de un producto y permitir que se lleve a cabo en pasos, es decir que en este patrón se construye un objeto complejo (una clase builder que construye el objeto final) usando objetos simples y utilizando un enfoque paso a paso.

En javascript, con ECMAScript 6, podemos aplicar este patrón con la palabra reservada new. De esta manera podemos crear nuevas instancias de un objeto, las cuales tendrán las propiedades y funciones de la clase que estamos instanciando.

2. Patrón prototipo

Con este patrón podemos crear un objeto que sirva de modelo para otros objetos. De esta forma se elimina la duplicidad del código.

En javascript, el concepto de clase de la POO (Programación Orientada a Objetos, el cual es un paradigma de programación que está basado en el concepto de clases y objetos) no existe como tal. Lo que existen son los prototipos. Un prototipo es un objeto especial que poseen todos los objetos en el cual se almacenan las propiedades. Cuando se accede a una propiedad de un objeto (objeto.propiedad) se busca en el propio objeto. Si no existe, se busca en su prototipo y así continúa en cadena.

3. Patrón singleton

En este patrón se crean objetos únicos, de un tipo, para el que solo hay una instancia y proporciona un acceso global a dicha instancia. Este es el más simple de todos los patrones en términos de diagramas, ya que solo tiene una instancia. Este es un patrón para asegurar que solo se maneje una sola instancia de un objeto.

4. Patrón módulo

Se basa en los objetos literales de javascript ({}). Cada vez que se define un objeto con sus propiedades y métodos, se define un módulo.

5. Patrón módulo revelador

El patrón módulo revelador tiene una API pública y una privada a diferencia del patrón módulo en el que todo es público.

En este no se utiliza la sintaxis {} de objetos literales para definir un módulo, si no que se hace con una función ejecutada inmediatamente (IIFE).

Patrones de comportamiento

  1. Patrón iterador

Con este patrón se puede acceder a los elementos de un objeto secuencialmente sin necesidad de conocer su estructura, y además la responsabilidad de recorrer los elementos recae sobre el iterador.

Este patrón nos ofrece el método next para acceder al siguiente valor de una colección. Si hemos acabado de iterar nos lo indicará mediante la propiedad done.

2. Patrón observador (publisher/subscriber)

Este patrón define una dependencia de uno a muchos objetos de tal manera que cuando un objeto cambia de estado, todos sus dependientes son notificados y actualizados automáticamente. En este se tienen dos elementos el objeto subscriber el cual estará a la escucha de eventos y el objeto publisher que será el que dispare dichos eventos.

Es un patrón que mantiene a los objetos al tanto cuando sucede algo que les interesa. El funcionamiento del patrón observer se asemeja mucho al funcionamiento de un periódico o editorial y sus suscriptores. Es decir, que cuando alguien se subscribe a una editorial o cada vez que hay una nueva edición, esto se notifica a todos los que estén suscritos con el fin de que siempre estén informados de lo que pasa y mientras el editor esté activo cualquiera puede suscribirse y darse de baja.

Editores + Suscriptores = Patrón del Observador

Un ejemplo práctico de este patrón en javascript es el método addEventListener. Este método registra un evento específico sobre un objeto. Cuando el evento se dispare dicho objeto recibirá una notificación y podremos realizar la acción o la lógica necesaria. Por ejemplo, podemos registrar el click del ratón sobre un elemento: elemento.addEventListener(“click”, ejecutarFuncion, false);

3. Patrón comando

Con este patrón ejecutamos una operación sin saber el contenido de la misma, encapsulando la petición y facilitando su parametrización.

En el siguiente ejemplo tenemos un método genérico run al que le indicaremos el método y argumentos que queremos ejecutar.

4. Patrón cadena de responsabilidad

Este patrón nos permite encapsular un dato y agregar métodos que podemos ejecutar de forma encadenada para modificar el estado o valor del dato.

5. Patrón mediador

Este patrón es parecido al observador en lo referente a concepto de publisher/subscriber con la diferencia de que la responsabilidad de realizar la comunicación recae sobre un tercero, el mediador. En ese sentido los objetos se suscriben al mediador y este es el encargado de recibir y enviar los eventos.

Una librería bastante conocida que usa este patrón es Redux.

Patrones estructurales

  1. Patrón mixin

Este patrón permite añadir funcionalidades a una clase existente sin tener que alterar la clase.

A continuación podemos ver un ejemplo en donde se declara el objeto mixin con dos métodos. Estos métodos se asigna a la clase Niño mediante Object.assing, Automáticamente la clase Niño podrá acceder a los métodos decirEdad y saludar.

2. Patrón decorator

El patrón decorator es similar al patrón mixin salvo que en lugar de agregar funcionalidades al prototipo lo hace con las instancias de clase.

3. Patrón proxy

Este patrón permite usar un objeto que haga de intermediario de otro, permitiéndo controlar el acceso al objeto.

4. Patrón adaptador

Este patrón permite convertir la interfaz de una clase en otra que se adapte a las necesidades, consiguiendo de esta forma que ambas clases puedan convivir sin problema.

El patrón adaptador traduce una interfaz a otra. Se utiliza comúnmente para integrar nuevos componentes en una aplicación legacy.

5. Patrón facade

Este patrón proporciona una interfaz que abstrae lo necesario de una funcionalidad compleja. Al aplicar este patrón solo se expone lo necesario haciendo el código más simplificado y fácil de utilizar.

Conclusiones

  • Hay muchos patrones de diseño que pueden ser aplicados de maneras distintas dependiendo de la aplicación, pero deben ser usados de forma que provean una mayor flexibilidad a nuestra aplicación y no un mayor grado de dificultad por un uso de patrones indebido.
  • Los patrones ayudan a estandarizar el código, haciendo que el diseño sea más comprensible para otros programadores. Son muy buenas herramientas que simplifican el proceso del desarrollo en ambientes colaborativos.
  • Los patrones de diseño son herramientas muy importantes para cualquier desarrollador y por ende se debe tener conocimiento sobre ellas. Además, comprender los diferentes patrones de diseño resulta una ventaja importante durante el ciclo de vida de cualquier proyecto, ya que puede ahorrar tiempo en la implementación, la actualización y el mantenimiento de las aplicaciones.

En este articulo presentamos una lista muy variada de patrones que nos dan la oportunidad de desarrollar nuestra aplicación de manera mucho más sencilla con estructuras probadas y que funcionan. La mayor dificultad radica en saber cuándo utilizarlas, algo que nos dará la práctica.

--

--