Factory Method: Este patrón define un método que las subclases pueden sobrescribir para
crear objetos. Esto permite que las clases deleguen la responsabilidad de crear instancias de
clases derivadas sin conocer los detalles específicos de estas instancias. Ejemplo: la creación de
botones en una interfaz gráfica puede variar según el sistema operativo (Windows, Mac, Linux).
Abstract Factory: Proporciona una interfaz para crear familias de objetos relacionados sin
especificar sus clases concretas. Es útil cuando el sistema debe ser independiente de cómo se
crean los objetos, y permite crear familias de productos que pueden trabajar juntos. Ejemplo: una
fábrica de vehículos puede tener diferentes implementaciones para coches eléctricos y coches a
gasolina.
Adapter: Convierte la interfaz de una clase en otra interfaz que el cliente espera. El adaptador
permite que clases que normalmente no podrían trabajar juntas debido a interfaces incompatibles
lo hagan de manera efectiva. Ejemplo: un cargador de corriente europeo adaptado para usarse en
un enchufe americano.
Bridge: Desacopla la abstracción de su implementación para que ambas puedan variar
independientemente. Es útil cuando quieres separar dos dimensiones de un sistema que cambian
de forma independiente. Ejemplo: una herramienta de dibujo que separa las formas geométricas
(círculos, rectángulos) de las maneras en que se dibujan (en pantalla, impresora).
Chain of Responsibility: Permite que múltiples objetos tengan la oportunidad de manejar
una solicitud. Los objetos están encadenados y la solicitud se pasa a lo largo de la cadena hasta
que un objeto se hace cargo. Ejemplo: un sistema de soporte técnico en el que la solicitud se pasa
a diferentes niveles (soporte básico, técnico, experto).
Command: Encapsula una solicitud como un objeto, permitiendo parametrizar clientes con
diferentes solicitudes, encolar solicitudes, o incluso deshacer operaciones. Ejemplo: un menú de
deshacer/rehacer en una aplicación de edición de texto.
Iterator: Proporciona una manera de acceder secuencialmente a los elementos de una
colección sin exponer su estructura interna. El patrón abstrae la lógica de iteración para facilitar
el recorrido de diferentes colecciones. Ejemplo: recorrer una lista, conjunto o árbol sin necesidad
de conocer su implementación interna.
Mediator: Define un objeto que centraliza la comunicación entre un conjunto de objetos,
promoviendo un acoplamiento flexible. Los objetos se comunican a través del mediador en lugar
de referirse directamente entre ellos. Ejemplo: un sistema de chat donde los usuarios envían
mensajes a través de un servidor que media la comunicación.
Builder: Facilita la creación de objetos complejos al separar la construcción del objeto de su
representación final. Este patrón es útil cuando el proceso de creación implica múltiples pasos.
Ejemplo: un proceso para construir un coche en el que diferentes partes (motor, carrocería) se
ensamblan paso a paso.
Prototype: Permite crear nuevos objetos copiando instancias existentes (prototipos) en lugar
de crear objetos desde cero. Es útil cuando los objetos a crear son costosos de inicializar.
Ejemplo: clonación de objetos en un sistema gráfico en el que se requiere duplicar elementos
como formas o texto.
Composite: Permite a los objetos ser tratados de manera uniforme si forman parte de una
estructura jerárquica como un árbol. Los objetos compuestos pueden contener otros objetos, lo
que facilita la representación de estructuras jerárquicas complejas. Ejemplo: un sistema de
archivos donde tanto archivos individuales como directorios (que contienen más archivos)
pueden ser manipulados de manera similar.
Decorator: Agrega comportamiento o responsabilidades adicionales a un objeto
dinámicamente, sin modificar su clase. Es útil cuando no puedes modificar la clase directamente
pero necesitas ampliar su funcionalidad. Ejemplo: añadir funcionalidades como encriptación o
compresión a una clase que maneja archivos.
Memento: Permite capturar y restaurar el estado interno de un objeto sin violar su
encapsulación. Es útil para implementar funcionalidades de deshacer (undo) o para guardar el
estado temporal de un objeto. Ejemplo: en un editor de texto, el memento puede guardar el
estado del documento para permitir al usuario deshacer cambios.
Observer: Define una dependencia uno-a-muchos entre objetos. Cuando el objeto observado
cambia de estado, notifica a todos sus observadores, permitiendo que estos se actualicen
automáticamente. Ejemplo: una interfaz gráfica donde varios elementos se actualizan
automáticamente cuando cambia el estado del modelo subyacente.
State: Permite que un objeto cambie su comportamiento cuando su estado interno cambia. Es
similar a tener múltiples clases con comportamientos diferentes, pero usando una única clase que
cambia su estado interno. Ejemplo: el comportamiento de una máquina de café que varía según si
está esperando monedas, sirviendo café o dando cambio.
Strategy: Permite definir una familia de algoritmos, encapsular cada uno y hacerlos
intercambiables. El patrón permite que el algoritmo varíe de forma independiente del cliente que
lo usa. Ejemplo: un sistema de pago que puede seleccionar diferentes estrategias de pago (tarjeta
de crédito, PayPal, transferencia bancaria).
Singleton: Asegura que una clase tenga una única instancia y proporciona un punto de acceso
global a esa instancia. Es útil cuando solo debe existir un único objeto de una clase. Ejemplo: un
sistema de log en el que solo existe un único archivo de registro que almacena todos los eventos.
Facade: Proporciona una interfaz simplificada para un conjunto de clases más complejas o un
sistema complejo. El patrón oculta los detalles del sistema subyacente y ofrece una interfaz más
amigable. Ejemplo: una librería que ofrece una interfaz única para manejar el procesamiento de
gráficos, escondiendo la complejidad de varias APIs subyacentes.
Flyweight: Minimiza el uso de recursos compartiendo tanta información como sea posible
entre objetos similares. Es útil cuando se manejan grandes cantidades de objetos similares.
Ejemplo: en un editor de texto, las letras pueden representarse como objetos compartidos
(flyweights) para ahorrar memoria.
Template Method: Define el esqueleto de un algoritmo en una clase base, permitiendo que
las subclases implementen pasos específicos del algoritmo sin cambiar su estructura general.
Ejemplo: una clase base que define los pasos para procesar un archivo, donde las subclases
especifican cómo leer y escribir en diferentes formatos.
Visitor: Permite agregar nuevas operaciones a una estructura de objetos sin modificar sus
clases. Esto se logra separando las operaciones de las estructuras de datos. Ejemplo: un sistema
de procesamiento de documentos donde puedes agregar nuevos comportamientos (como calcular
el número de palabras o imprimir en diferentes formatos) sin modificar la clase base de los
documentos.
Proxy: Proporciona un objeto sustituto o controlador que controla el acceso a otro objeto. Es
útil cuando necesitas controlar el acceso a objetos costosos o sensibles. Ejemplo: un proxy de red
que actúa como intermediario para controlar el acceso a un servidor remoto.