Están organizados en tres categorías principales según el libro "Design Patterns: Elements of Reusable Object-Oriented Software" (Gang of Four, GoF). A continuación, los patrones más usados dentro de cada categoría y algunos otros populares adicionales:
1. Creacionales
Estos patrones abordan la creación de objetos, asegurando que el sistema sea independiente de cómo se crean, componen y representan.
-
Singleton
- Garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a ella.
-
Factory Method
- Define una interfaz para crear objetos, pero permite que las subclases decidan cuál clase instanciar.
-
Abstract Factory
- Proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.
-
Builder
- Separa la construcción de un objeto complejo de su representación, permitiendo que el mismo proceso de construcción cree diferentes representaciones.
-
Prototype
- Permite clonar objetos existentes en lugar de crearlos desde cero, evitando el costo de inicialización compleja.
2. Estructurales
Estos patrones se ocupan de cómo componer clases y objetos para formar estructuras más grandes.
-
Adapter
- Permite que clases con interfaces incompatibles trabajen juntas mediante un "adaptador".
-
Decorator
- Añade funcionalidad adicional a un objeto de forma dinámica.
-
Proxy
- Proporciona un sustituto o marcador de posición para controlar el acceso a un objeto.
-
Composite
- Compone objetos en estructuras de árbol para representar jerarquías parte-todo, permitiendo que los clientes traten objetos individuales y compuestos de manera uniforme.
-
Bridge
- Desacopla una abstracción de su implementación para que ambas puedan variar de manera independiente.
-
Facade
- Proporciona una interfaz simplificada a un conjunto de interfaces en un subsistema.
-
Flyweight
- Reduce el costo de creación de objetos, reutilizando instancias existentes cuando es posible.
3. Comportamentales
Estos patrones se centran en la interacción y la responsabilidad entre objetos.
-
Strategy
- Define una familia de algoritmos, encapsula cada uno y los hace intercambiables.
-
Observer
- Permite que un objeto notifique a múltiples objetos interesados cuando cambia su estado.
-
Command
- Encapsula una solicitud como un objeto, permitiendo parametrizar clientes con diferentes solicitudes, hacer colas o registros de comandos, y soportar deshacer/rehacer.
-
State
- Permite que un objeto cambie su comportamiento cuando cambia su estado interno.
-
Template Method
- Define el esqueleto de un algoritmo en una operación, permitiendo que las subclases redefinan ciertos pasos sin cambiar la estructura general.
-
Mediator
- Descentraliza la comunicación entre objetos mediante un mediador.
-
Chain of Responsibility
- Permite que varios objetos manejen una solicitud, pasando la solicitud a lo largo de una cadena.
-
Iterator
- Proporciona una manera de acceder a los elementos de un objeto compuesto de forma secuencial sin exponer su representación subyacente.
-
Visitor
- Permite agregar nuevas operaciones a estructuras de objetos sin modificar sus clases.
-
Memento
- Captura y externaliza el estado interno de un objeto para poder restaurarlo más tarde.
Patrones Adicionales y Modernos
Además de los patrones clásicos de GoF, algunos patrones más modernos son ampliamente usados en el desarrollo de software:
-
Dependency Injection (DI)
- Permite inyectar dependencias en lugar de que un objeto las cree por sí mismo.
-
Model-View-Controller (MVC)
- Desglosa una aplicación en tres componentes principales: modelo, vista y controlador.
-
Repository
- Abstrae la lógica para acceder a datos de una base de datos o fuente externa.
-
Unit of Work
- Mantiene un registro de los cambios realizados a los datos para coordinar actualizaciones atómicas.
-
Event Sourcing
- Representa el estado de una entidad como una secuencia de eventos en lugar de un único estado.
-
CQRS (Command Query Responsibility Segregation)
- Separa las operaciones de lectura (query) de las operaciones de escritura (command) en diferentes modelos.
Estos patrones forman la base de muchas soluciones de software modernas y se eligen según las necesidades del problema y el contexto de la aplicación.