- Singleton - Garantizar una única instancia
- Factory Method - Crear objetos sin especificar clases
- Builder - Construir objetos complejos paso a paso
- Adapter - Hacer compatibles interfaces incompatibles
- Decorator - Añadir funcionalidad dinámicamente
- Observer - Notificar cambios a múltiples objetos
- Strategy - Intercambiar algoritmos en tiempo de ejecución
- Command - Encapsular solicitudes como objetos
- Template Method - Definir estructura de algoritmo
- State - Cambiar comportamiento según estado
Un patrón de diseño es una solución reutilizable a un problema común en el diseño de software. No es código específico, sino una plantilla conceptual que describe cómo resolver un problema que puede presentarse en muchas situaciones diferentes.
- Reutilización: Soluciones probadas y testadas
- Comunicación: Lenguaje común entre desarrolladores
- Flexibilidad: Fácil modificación y extensión
- Mantenibilidad: Código más organizado y comprensible
- Complejidad: Pueden añadir overhead innecesario
- Sobre-ingeniería: No siempre son necesarios
- Curva de aprendizaje: Requieren tiempo para dominarlos
Propósito: Proporcionar mecanismos de creación de objetos que aumenten la flexibilidad y reutilización del código.
Principios:
- Encapsular la lógica de creación
- Desacoplar el código cliente de las clases concretas
- Proporcionar flexibilidad en la creación de objetos
Ejemplos: Singleton, Factory Method, Builder, Abstract Factory, Prototype
Propósito: Componer clases y objetos para formar estructuras más grandes y flexibles.
Principios:
- Composición sobre herencia
- Interfaces estables
- Flexibilidad en la estructura
Ejemplos: Adapter, Decorator, Facade, Proxy, Composite, Bridge, Flyweight
Propósito: Gestionar algoritmos, responsabilidades y comunicación entre objetos.
Principios:
- Encapsular comportamiento variable
- Comunicación flexible entre objetos
- Separación de responsabilidades
Ejemplos: Observer, Strategy, Command, Template Method, State, Chain of Responsibility, Iterator, Mediator, Memento, Visitor
- Cuándo usar: Cuando necesitas exactamente una instancia
- Ejemplo: Logger, Configuración, Conexión a BD
- Relevancia en 42: Muy común en proyectos de sistemas
- Cuándo usar: Notificar cambios a múltiples objetos
- Ejemplo: MVC, Eventos de UI, Sistema de notificaciones
- Relevancia en 42: Fundamental en arquitecturas de software
- Cuándo usar: Crear objetos sin conocer su clase exacta
- Ejemplo: Crear diferentes tipos de archivos, formas geométricas
- Relevancia en 42: Muy útil en proyectos de programación
- Cuándo usar: Intercambiar algoritmos en tiempo de ejecución
- Ejemplo: Diferentes algoritmos de ordenamiento, validaciones
- Relevancia en 42: Fundamental en algoritmos y estructuras de datos
- Cuándo usar: Hacer compatibles interfaces incompatibles
- Ejemplo: Integrar librerías externas, APIs diferentes
- Relevancia en 42: Muy útil en proyectos de integración
- Patrones relacionados: Strategy, Command
- Aplicación: Cada clase tiene una sola responsabilidad
- Patrones relacionados: Decorator, Observer, Strategy
- Aplicación: Abierto para extensión, cerrado para modificación
- Patrones relacionados: Template Method, Strategy
- Aplicación: Los objetos derivados deben ser sustituibles por sus bases
- Patrones relacionados: Adapter, Facade
- Aplicación: Interfaces específicas son mejores que generales
- Patrones relacionados: Factory Method, Abstract Factory, Dependency Injection
- Aplicación: Depender de abstracciones, no de concreciones
-
¿Qué problema estoy resolviendo?
- Creación de objetos → Patrones Creacionales
- Estructura de clases → Patrones Estructurales
- Comportamiento → Patrones Comportamentales
-
¿Cuál es el contexto?
- Sistema simple → Patrones básicos (Singleton, Factory)
- Sistema complejo → Patrones avanzados (Observer, Strategy)
-
¿Qué flexibilidad necesito?
- Alta flexibilidad → Strategy, Observer, Decorator
- Baja flexibilidad → Singleton, Template Method
Problema | Patrón Recomendado | Alternativas |
---|---|---|
Una sola instancia | Singleton | - |
Crear objetos | Factory Method | Abstract Factory, Builder |
Notificar cambios | Observer | Mediator |
Intercambiar algoritmos | Strategy | Template Method |
Añadir funcionalidad | Decorator | Adapter |
Hacer compatible | Adapter | Facade |
// Template Method con templates
template<typename T>
class Algorithm {
public:
void execute() {
step1();
step2();
step3();
}
protected:
virtual void step1() = 0;
virtual void step2() = 0;
virtual void step3() = 0;
};
// Singleton con RAII
class Singleton {
private:
static std::unique_ptr<Singleton> instance;
Singleton() = default;
public:
static Singleton& getInstance() {
if (!instance) {
instance = std::make_unique<Singleton>();
}
return *instance;
}
};
// Observer con smart pointers
class Subject {
private:
std::vector<std::weak_ptr<Observer>> observers;
public:
void attach(std::shared_ptr<Observer> observer) {
observers.push_back(observer);
}
};
- "Design Patterns" - Gang of Four (GoF)
- "Head First Design Patterns" - Freeman & Robson
- "Patterns of Enterprise Application Architecture" - Martin Fowler
- Refactoring Guru - Explicaciones detalladas
- Source Making - Ejemplos prácticos
- C++ Reference - Documentación C++
- Cub3D: Observer, Strategy, Factory Method
- Philosophers: Singleton, Observer, State
- Minishell: Command, Strategy, Factory Method
- Webserv: Observer, Strategy, Adapter
- Estudia los patrones individuales en sus archivos específicos
- Practica implementaciones en C++
- Identifica patrones en código existente
- Aplica patrones en tus proyectos de 42
¡Los patrones de diseño son herramientas poderosas que te ayudarán a escribir código más limpio, flexible y mantenible! 🚀