Patrones de Diseño
Tags: programming, architecture
Published: 2022-02-06 11:43:20

En ingeniería de software se conoce como patrón de diseño a una solución estandarizada, probada y repetible a un problema común en el diseño de software. Un patrón de diseño es una descripción o plantilla (abstracción) sobre cómo resolver un problema que se puede utilizar en muchas situaciones diferentes.

Cada patrón es una solución particular a ciertos problemas, pero puede no ser útil para otros.

Los patrones de diseño pretenden:
- Proporcionar catálogos de elementos reusables y mantenible en el diseño de sistemas de software.
- Evitar la reiteración en la búsqueda de soluciones a problemas ya conocidos y solucionados anteriormente.
- Formalizar un vocabulario común entre diseñadores.
- Estandarizar el modo en que se realiza el diseño.
- Facilitar el aprendizaje a las nuevas generaciones de diseñadores condensando conocimiento ya existente.

Asimismo, no pretenden:
- Imponer ciertas alternativas de diseño frente a otras.
- Eliminar la creatividad inherente al proceso de diseño.

No es obligatorio utilizar los patrones, solo es aconsejable en el caso de tener el mismo problema o similar que soluciona el patrón, siempre teniendo en cuenta que en un caso particular puede no ser aplicable. "Abusar o forzar el uso de los patrones puede ser un error".


Se clasifican en 3 grupos:

**Creacionales:** se ocupan de los mecanismos de creación de objetos, tratando de crearlos de una manera adecuada a la situación. La forma básica de creación de objetos podría resultar en problemas de diseño o en una mayor complejidad al mismo. Los patrones de diseño de creación resuelven este problema controlando de alguna manera la creación de este objeto.
Los patrones de diseño creacional se componen de dos ideas dominantes. Uno es encapsular el conocimiento sobre las clases concretas que usa el sistema. Otro es ocultar cómo se crean y combinan instancias de estas clases concretas.

**Estructurales:** se preocupan por cómo se pueden componer las clases y los objetos para formar estructuras más grandes. Los patrones de diseño estructural simplifican el árbol de clases al identificar las relaciones. Estos patrones se centran en cómo las clases se heredan entre sí y cómo se componen de otras clases.

**Comportamiento:** se preocupan por proporcionar soluciones con respecto a la interacción entre objetos: cómo se comunican, cómo algunos dependen de otros y cómo segregarlos para que sean dependientes e independientes y brinden flexibilidad y capacidades de prueba.


## Creacionales:

**Singleton:** nos permite asegurarnos de que una **clase **tenga una única instancia, a la vez que proporciona un punto de acceso global a dicha instancia.
¿Por qué querría alguien controlar cuántas instancias tiene una clase? El motivo más habitual es controlar el acceso a algún recurso compartido, por ejemplo, una base de datos o un archivo.
Funciona así: imagina que has creado un objeto y al cabo de un tiempo decides crear otro nuevo. En lugar de recibir un objeto nuevo, obtendrás el que ya habías creado.

**Factory:** proporciona una **interfaz** para crear objetos en una **superclase**, mientras permite a las subclases decidir que tipo de objetos que se crearán.
El patrón Factory Method sugiere que, en lugar de llamar al operador new para construir objetos directamente, se invoque a un método fábrica especial. No te preocupes: los objetos se siguen creando a través del operador new, pero se invocan desde el método fábrica. Los objetos devueltos por el método fábrica a menudo se denominan productos.

**Abstract Factory:** Es básicamente una fabrica de fábricas.
Nos permite producir familias de objetos relacionados sin especificar sus clases concretas


## Estructurales:

**Facade (Fachada):** La fachada define una **interfaz** de alto nivel, capaz de ocultar la complejidad de un subsistema, haciendo el mismo más sencillo de usar. 
Es una forma de encapsular dicho subsistema (complejo), es decir, puede proporcionar una funcionalidad limitada en comparación con trabajar directamente con el subsistema. No obstante, es justamente la idea, de tan solo incluir las funciones realmente importantes para los clientes. Usando directamente ésta nueva clase Facade, logramos desacoplarnos del uso directo del subsistema.

**Decorator:** permite añadir funcionalidades a un objeto existente sin alterar su estructura, es decir, sin modificar la clase base.


## Antipatrón de diseño

Un antipatrón de diseño es un patrón de diseño que invariablemente conduce a una mala solución para un problema específico.


## Recursos:
[Refactoring Guru](https://refactoring.guru/es/design-patterns/factory-method)
[Sourcemaking](https://sourcemaking.com/design_patterns/factory_method)
[Wikipedia](https://en.wikipedia.org/wiki/Design_Patterns)
[Youtube](https://www.youtube.com/playlist?list=PLvimn1Ins-41Uiugt1WbpyFo1XT1WOquL)