Tema: Patrones de Diseño - Gang of Four (GoF)
Los patrones de diseño son soluciones estandarizadas a problemas comunes en el desarrollo de software orientado a objetos. Fueron formalizados por Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides (el "Grupo de los Cuatro") en 1994.
1. Clasificación General
| Categoría |
Cantidad |
Enfoque Principal |
| Creacionales |
5 |
Mecanismos de creación de objetos, abstrayendo la instanciación. |
| Estructurales |
7 |
Cómo se combinan clases y objetos para formar estructuras más grandes. |
| De Comportamiento |
11 |
Comunicación, algoritmos y asignación de responsabilidades. |
2. Patrones Creacionales (5)
1. Abstract Factory
- Definición: Proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.
- ¿Para qué?: Cuando el sistema debe ser independiente de cómo se crean sus productos y manejas kits de herramientas compatibles entre sí.
- ¿Cómo?: Define una interfaz con un método de creación por cada producto; las fábricas concretas implementan estos métodos.
2. Builder
- Definición: Separa la construcción de un objeto complejo de su representación, permitiendo que el mismo proceso de construcción cree diferentes representaciones.
- ¿Para qué?: Para crear objetos con muchas partes opcionales o configuraciones complejas (ej. un generador de documentos PDF/HTML).
- ¿Cómo?: Un objeto "Director" coordina a un "Builder" que construye el producto paso a paso.
3. Factory Method
- Definición: Define una interfaz para crear un objeto, pero deja que las subclases decidan qué clase instanciar.
- ¿Para qué?: Cuando una clase no puede anticipar la clase de objetos que debe crear.
- ¿Cómo?: Se crea un método abstracto en la clase padre y las subclases lo sobrescriben devolviendo la instancia concreta.
4. Prototype
- Definición: Crea nuevos objetos a partir de la clonación de una instancia existente (un prototipo).
- ¿Para qué?: Cuando el coste de crear un objeto desde cero es mayor que clonarlo (ej. carga pesada de base de datos).
- ¿Cómo?: Los objetos implementan una interfaz
clone().
5. Singleton
- Definición: Garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a ella.
- ¿Para qué?: Para objetos que solo deben existir una vez: gestores de hilos, colas de impresión o pools de conexiones.
- ¿Cómo?: Constructor privado, instancia estática privada y un método público
getInstance().
3. Patrones Estructurales (7)
1. Adapter
- Definición: Convierte la interfaz de una clase en otra que el cliente espera. Permite que clases con interfaces incompatibles trabajen juntas.
- ¿Para qué?: Reutilizar clases existentes cuya interfaz no coincide con lo que necesitamos.
- ¿Cómo?: Una clase "envoltorio" implementa la interfaz requerida y delega las llamadas al objeto incompatible.
2. Bridge
- Definición: Desacopla una abstracción de su implementación para que ambas puedan variar de forma independiente.
- ¿Para qué?: Evitar una explosión de clases cuando tienes múltiples jerarquías cruzadas (ej. Formas x Colores).
- ¿Cómo?: La abstracción contiene una referencia a una interfaz de implementación.
3. Composite
- Definición: Permite tratar objetos individuales y composiciones de objetos de manera uniforme (estructura jerárquica/árbol).
- ¿Para qué?: Para representar jerarquías todo-parte (ej. menús, sistemas de archivos).
- ¿Cómo?: Los elementos simples y los compuestos comparten la misma interfaz o clase base.
4. Decorator
- Definición: Añade responsabilidades a un objeto de manera dinámica y transparente, como alternativa a la herencia.
- ¿Para qué?: Extender funcionalidades en tiempo de ejecución sin modificar el código original ni crear mil subclases.
- ¿Cómo?: El decorador envuelve al objeto real y añade su propia lógica antes o después de llamar al original.
5. Facade (Fachada)
- Definición: Ofrece una interfaz unificada y simplificada para un conjunto de interfaces de un subsistema complejo.
- ¿Para qué?: Reducir la complejidad y el acoplamiento con librerías o frameworks difíciles de usar.
- ¿Cómo?: Una sola clase delega las peticiones del cliente a las múltiples clases internas del subsistema.
6. Flyweight (Peso Ligero)
- Definición: Se usa para reducir el uso de memoria compartiendo la mayor cantidad posible de datos con objetos similares.
- ¿Para qué?: Cuando tienes una cantidad enorme de objetos similares y la memoria es un problema.
- ¿Cómo?: Divide el estado en "intrínseco" (compartido) y "extrínseco" (contextual).
7. Proxy
- Definición: Proporciona un objeto sustituto o representante para controlar el acceso a otro objeto.
- ¿Para qué?: Control de acceso, carga perezosa (lazy loading) o acceso a objetos remotos.
- ¿Cómo?: Implementa la misma interfaz que el objeto real y actúa de intermediario.
4. Patrones de Comportamiento (11)
1. Chain of Responsibility
- Definición: Permite pasar una petición por una cadena de posibles manejadores hasta que uno de ellos la procesa.
- ¿Para qué?: Para desacoplar el emisor de una petición de sus posibles receptores.
- ¿Cómo?: Cada receptor tiene un puntero al "sucesor".
2. Command
- Definición: Encapsula una petición como un objeto, permitiendo parametrizar clientes, hacer colas o soportar operaciones de deshacer.
- ¿Para qué?: Implementar callbacks, sistemas de log de operaciones o botones de "undo".
- ¿Cómo?: Crea una interfaz con un método
execute().
3. Interpreter
- Definición: Define una representación de la gramática de un lenguaje junto con un intérprete para dicha gramática.
- ¿Para qué?: Para lenguajes sencillos o motores de reglas.
- ¿Cómo?: Cada regla gramatical es una clase con un método
interpret().
4. Iterator
- Definición: Permite acceder secuencialmente a los elementos de un objeto agregado sin exponer su estructura interna.
- ¿Para qué?: Recorrer cualquier colección (lista, árbol, etc.) de forma uniforme.
- ¿Cómo?: El iterador mantiene el estado del recorrido.
- Definición: Define un objeto que encapsula cómo interactúan un conjunto de objetos, evitando que se refieran entre sí explícitamente.
- ¿Para qué?: Eliminar conexiones "muchos a muchos" que crean código espagueti.
- ¿Cómo?: Los objetos notifican sus cambios al mediador y este coordina la respuesta.
6. Memento
- Definición: Permite capturar y guardar el estado interno de un objeto para poder restaurarlo más tarde sin romper la encapsulación.
- ¿Para qué?: Implementar puntos de control o sistemas de "deshacer".
- ¿Cómo?: El objeto genera un memento (instantánea) que solo él puede leer.
7. Observer
- Definición: Define una dependencia "uno a muchos", de modo que si un objeto cambia, todos sus dependientes son notificados automáticamente.
- ¿Para qué?: Sincronizar datos entre la lógica y la interfaz de usuario.
- ¿Cómo?: El "Sujeto" mantiene una lista de "Observadores" y llama a sus métodos de actualización.
8. State
- Definición: Permite que un objeto cambie su comportamiento cuando cambia su estado interno. El objeto parecerá haber cambiado de clase.
- ¿Para qué?: Evitar estructuras de control
if/else o switch gigantescas que dependen de un estado.
- ¿Cómo?: Se encapsula cada estado en una clase propia.
9. Strategy
- Definición: Define una familia de algoritmos, los encapsula y los hace intercambiables en tiempo de ejecución.
- ¿Para qué?: Seleccionar una lógica distinta según el contexto (ej. distintos métodos de compresión de archivos).
- ¿Cómo?: El cliente tiene una referencia a la interfaz de la estrategia.
10. Template Method
- Definición: Define el esqueleto de un algoritmo en una operación, delegando algunos pasos específicos a las subclases.
- ¿Para qué?: Reutilizar la estructura común de un algoritmo pero permitiendo variantes en pasos concretos.
- ¿Cómo?: Método en clase padre que llama a métodos "gancho" (hooks) que las hijas implementan.
11. Visitor
- Definición: Permite definir una nueva operación sobre una estructura de objetos sin modificar las clases de los elementos sobre los que opera.
- ¿Para qué?: Cuando la estructura de clases es estable pero necesitas añadir operaciones nuevas frecuentemente.
- ¿Cómo?: El elemento "acepta" al visitante, y este ejecuta la operación.
5. Tabla de Resumen para Repaso
| Patrón |
Tipo |
Palabra Clave |
| Singleton |
Creacional |
Instancia única global. |
| Builder |
Creacional |
Construcción paso a paso. |
| Adapter |
Estructural |
Compatibilidad/Envoltorio. |
| Facade |
Estructural |
Simplicidad/Puerta de entrada. |
| Observer |
Comportamiento |
Suscripción/Notificación. |
| Strategy |
Comportamiento |
Intercambio de algoritmos. |
| State |
Comportamiento |
Comportamiento según estado. |