Patrones de diseño y con que se comen 🤯
Published: 2023-05-22 02:09:55


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3g1arhqsxw3jko0id6vk.png)

Si comienzas en esto de la programación o incluso ya llevas tiempo te encontraras en algún momento de tu vida con el término "Patrones de diseño", entonces de ahí sale la pregunta

🤯 **¿Con que se comen los patrones de diseño?**

A grandes rasgos, son soluciones habituales para resolver problemas comunes en el desarrollo de software, cada patrón es algo así como un plano que se utiliza para resolver un problema de diseño particular en tu código.

Pero no cualquier cosa puede ser un patrón de diseño, debemos de tener ciertas características para poder llamarlo así, por ejemplo:

- Debe haber comprobado su efectividad resolviendo problemas similares en ocasiones anteriores.

- Otra es que debe ser reutilizable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.

🦸‍♀️Para esto tenemos en cuenta algunos tipos o categorias de patrones:

**Patrones creacionales**
Proporcionan mecanismos de creación de objetos para aumentar la flexibilidad y reutilización del código que ya tenemos

- **Abstract Factory:** Nos permite producir 👪familias de objetos relacionados, sin especificar clases concretas.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i1u3v2tqnjwsr6bsp4n5.png)

- **Builder Patterns:** Nos permite construir objetos complejos paso a paso.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r437qhca2rf50weg3yr7.png)
- **Singleton:** Nos permite asegurarnos de que una clase tenga una única instancia, a la vez que proporcionan un punto de acceso global para dicha instancia.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b72titfpdpadkiqos5mh.png)

**Patrones estructurales**
Dan soluciones y estandaares para las composiciones de clases y estructuras de objetos:

- **Adapter:** Lo utilizamos cuando tenemos interfaces de software incompatibles, las cuales a pesar de la incompatibilidad tienen una funcionalidad similar.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tnv9a6t0qkjwpfewdvh1.png)

- **Bridge:** Permite dividir una clase grande, o un grupo de clases estrechamente relacionadas, en dos jerarquías separadas (abstracción e implementación), pueden desarrollarse independientemente la una de la otra.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vrpys9vbwt5b9151hpsv.png)

- **Composite:** Permite componer objetos en estructuras de árbol y trabajar con esas estructuras como si fueran objetos individuales.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/brke5gppnrof343oh9x4.png)

- **Decorator:** Te permite añadir funcionalidades a objetos colocando estos objetos dentro de objetos encapsulados especiales que contienen esta funcionalidad.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bly3d9t6gwrm1zuwsye5.png)

**Patrones de comportamiento**
Se ocupa entre la comunicación entre los objetos de nuestras clases, están relacionados con la comunicación entre objetos:

- **Command:** Convierte una solicitud en un objeto independiente que contiene toda la información sobre la solicitud. Esta transformación permite parametrizar los métodos con diferentes solicitudes, retrasar o poner en cola la ejecución de una solicitud y soportar operaciones que no se pueden realizar.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dsuuhbyrck21zhnx5zcc.png)

- **Memento:** (También llamado Recuerdo, Instantánea, Snapshot) Te permite guardar y restaurar el estado previo de un objeto sin revelar los detalles de su implementación.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/shojutorwl508ikx0wbp.png)

- **Observer:** Te permite definir un mecanismo de suscripción para notificar a varios objetos sobre cualquier evento que le suceda al objeto que se está observando.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gq0rlu9nzew3sr597j3y.png)

- **Visitor:** Te permite separar algoritmos de los objetos sobre los que operan.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f567b3wp6580lutuyy47.png)


Entonces luego de leer todo el choro mareador 🥱 que estoy tratando de explicarte, puede que te preguntes:

**😒 ¿Yo que gano al aprenderlos?**

La respuesta es muy sencilla, podrías programar durante años sin conocer este tema, a muchos les pasa (me incluyo en ese circulo), pero…

Podrías implementarlos sin siquiera estar consiente de eso, entonces **¿Por qué dedicaría mi tiempo a aprenderlos?**, pues porque si y porque:

- Son herramientas con soluciones comprobadas a problemas habituales, aunque no te encuentres con estos problemas, los patrones de diseño nos ayudan a resolver problemas utilizando principios del diseño orientado a objetos.

- Definen un lenguaje común que podemos utilizar con nuestro equipo de trabajo para tener una mejor comunicación.

**🤔 ¿Qué patrón de diseño tengo que utilizar?**

En mi opinión profesional, es tiempo de entrar en pánico, correr en círculos y...


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ka7x8cu03fzg1drarte.png)

aaah te creas, puede que algunos te digan que unos son mejores que otros, pero realmente la experiencia nos ayudara para conocer si es adecuado utilizar uno u otro patrón de diseño a la hora de solucionar un problema particular.
_(Aunque a mí me gusta más la idea de correr en círculos 😱)_

**Att:** 🍉[La becaria ](https://twitter.com/SandyBecariaIt)