assistant: Un patrón de diseño es una solución reutilizable para un problema que ocurre dentro de un contexto de programación dado.

Algunos de los patrones de diseño más importantes son los siguientes:

Factory method
Una fábrica normal produce bienes; una fábrica de software produce objetos. Y no solo eso, lo hace sin especificar la clase exacta del objeto que se creará. Para lograr esto, los objetos se crean llamando a un método de fábrica en lugar de llamar a un constructor.

Singleton
El patrón singleton se utiliza para limitar la creación de una clase a un solo objeto. Esto es beneficioso cuando se necesita un objeto (y solo uno) para coordinar acciones en todo el sistema. Hay varios ejemplos en dónde debería existir una única instancia de una clase, incluidos cachés, grupos de subprocesos y registros.

Observer
Este patrón es una dependencia de uno a muchos entre objetos, de modo que cuando un objeto cambia de estado, se notifica a todos sus dependientes. Normalmente, esto se hace llamando a uno de sus métodos.
En aras de la simplicidad, piense en lo que sucede cuando sigue a alguien en Twitter. Básicamente, le estás pidiendo a Twitter que te envíe (el observador) actualizaciones de tweets de la persona (el sujeto) que seguiste. El patrón consta de dos actores, el observador que está interesado en las actualizaciones y el sujeto que genera las actualizaciones.

Strategy
El patrón de estrategia permite agrupar algoritmos relacionados bajo una abstracción, lo que permite cambiar un algoritmo o política por otro sin modificar el cliente. En lugar de implementar directamente un solo algoritmo, el código recibe instrucciones en tiempo de ejecución que especifican cuál del grupo de algoritmos ejecutar.

Adapter
Esto permite que las clases incompatibles trabajen juntas al convertir la interfaz de una clase en otra. Piense en ello como una especie de traductor: cuando dos jefes de estado que no hablan un idioma común se encuentran, generalmente un intérprete se sienta entre los dos y traduce la conversación, lo que permite la comunicación.
Si tienes dos aplicaciones, una de las cuales arroja la salida como XML y la otra requiere una entrada JSON, entonces necesitará un adaptador entre las dos para que funcionen sin problemas.

Builder
Como su nombre lo indica, se utiliza un patrón de construcción para construir objetos. A veces, los objetos que creamos pueden ser complejos, estar formados por varios subobjetos o requerir un elaborado proceso de construcción. El ejercicio de crear tipos complejos se puede simplificar utilizando el patrón de construcción. Un objeto compuesto o agregado es lo que generalmente construye un constructor.
Consideración clave: el patrón Builder puede parecer similar al patrón de "fábrica abstracta", pero una diferencia es que el patrón Builder crea un objeto paso a paso, mientras que el patrón de fábrica abstracto devuelve el objeto de una vez.

State
El patrón State encapsula los diversos estados en los que puede estar una máquina y permite que un objeto altere su comportamiento cuando cambia su estado interno. La máquina o el contexto, como se le llama en lenguaje de patrones, puede tener acciones que lo impulsen a diferentes estados. Sin el uso del patrón, el código se vuelve inflexible y está plagado de condicionales if-else.