PATRONES DE DISEÑO DE SOFTWARE
Patrón: juego de herramientas que brindan soluciones a problemas en el diseño de software, ayuda a la comunicación con eficacia
Patrones Estructurales

Adapter
Permite la colaboración entre objetos con interfaces incompatibles

Bridge
Permite dividir una clase grande, en 2 jerarquías separadas (abstracción e implementación), que se desarrollan independientemente

Composite
Permite componer objetos en estructuras de árbol y trabajar con ellas como si fueran objetos individuales

Decorator
Permite añadir funcionalidades a objetos, colocando estos objetos dentro de objetos encapsuladores especiales

Facade
Proporciona una interfaz simplificada a una biblioteca, un framework o cualquier grupo complejo de clases

Flyweight
Permite mantener más objetos dentro de la RAM, compartiendo entre varios objetos en lugar de toda la información en cada objeto

Proxy
Permite proporcionar un sustituto de posición para otro objeto
Patrones de Comportamiento

Chain of Responsability
Permite pasar solicitudes a lo largo de una cadena de manejadores, cada manejador decide si la procesa o si la para al siguiente

Command
Convierte una solicitud en un objeto independiente que contiene toda la información sobre la solicitud

Iterator
Permite recorrer elementos de una colección sin exponer su representación subyacente(lista, pila, árbol, etc.)

Mediator
Permite reducir las dependencias caóticas entre objetos. Restringe las comunicaciones directas entre objetos, colaborando por medio de un objeto mediador

Memento
Permite guardar y restaurar el estado previo de un objeto sin revelar los detalles de su implementación

Observer
Permite definir un mecanismo de suscripción para notificar a varios objetos sobre cualquier evento que le suceda al objeto que están observando

State
Permite a un objeto alterar su comportamiento cuando su estado interno cambia, como si el ibjeto cambiara su clase

Strategy
Permite definir una familia de algoritmos, colocar a cada uno de ellos en una clase separada y hacer sus objetos intercambiables

Template Method
Define un esqueleto de un algoritmo en la superclase pero permite que las subclases sobrescriban pasas del algoritmo si cambiar su estructura

Visitor
Permite separar algoritmos de los objetos sobre los que operan

Patrón MVC: Separa la lógica de negocios y la capa de representación entre sí.

Modelo
Contiene los datos de dominio, almacenan información del sistema que estamos desarrollando. Encontramos la lógica del negocio de la aplicación, es decir las reglas, acciones y restricciones que nos permiten gestionar las entidades del dominio. También es el encargado de gestionar el almacenamiento y recuperación de datos y entidades del dominio (DAL - Data Acces Layes y ORMs)

Vista
Es el UI de la aplicación. Presenta los datos del modelo al usuario, genera la interfaz de la aplicación, compone pantallas, páginas, entre otros. La vista es la representación del Modelo, contiene los elementos de interacción, adaptados a la tecnología del cliente.

Controlador
Existe entre la vista y el modelo, escucha los eventos desencadenados por la vista y ejecuta. También transforma datos para hacer que la Vista y el Modelo se entiendan traduciendo la información desde la interfaz, a la vez tomará la información del Modelo y la adaptará a formatos o estructuras de datos.
Patrones creacionales

Factory Method
Objetos en superclase, las subclases alteran el tipo de objeto que se crean

Abstract Factory
Produce familias de objetos relacionados sin especificar sus clases concretas

Builder
Contruye objetos complejos. Permite producir distintos tipos y representaciones de un objeto empleando el mismo código de construcción

Prototype
Permite copiar objetos existentes sin que el código dependa de sus clases

Singlenton
Asegura que una clase tenga una única instancia, proporciona un punto de acceso global de la instancia
PATRÓN ARQUITECTURA DE SOFTWARE
Patrones más importantes

Observer
Patrón de comportamiento que define un mecanismo de suscripción para notificar a varios objetos sobre un evento que le suceda al objeto que están obsrvando.

Un mecanismo de suscripción permite a los objetos suscribirse a notificaciones de eventos

El notificador notifica a los suscriptores el método de notificación específico de sus objetos

Estructura

Singleton
Patrón de diseño creacional, permite asegurar que una clase tenga una única instancia, a la vez que proporciona un punto de aceso global a dicha instancia.

Estructura
La clase Singleton declara el método estático obtenerInstancia, que devuelve la misma instancia de su propia clase, la llamada al método obtenerInstancia debe ser la única manera de obtener el objeto de Singleton.