Patrones de diseño estructurales: Facade, Flyweight y Proxy
Los patrones de diseño estructurales te ayudan a organizar clases y objetos.
Hoy cubriremos los últimos tres patrones para completar tu caja de herramientas.
1. El patrón Facade Facade simplifica sistemas complejos. Proporciona una interfaz sencilla para un grupo de clases desordenadas.
Piensa en un cine. Para ver una película, necesitas atenuar las luces, encender el proyector y abrir las cortinas. En lugar de llamar a cinco sistemas diferentes, llamas a un solo método: theater.watch_movie().
Úsalo cuando:
- Quieras simplificar un subsistema complejo.
- Necesites un único punto de entrada para una API extensa.
- Quieras desacoplar a los clientes de la lógica interna.
2. El patrón Flyweight Flyweight ahorra memoria. Funciona cuando tienes miles de objetos similares.
En lugar de almacenar cada detalle en cada objeto, divides los datos. Mantienes los datos compartidos e inalterables (estado intrínseco) en un solo lugar. Mantienes los datos únicos (estado extrínseco) por separado.
Úsalo cuando:
- El uso de memoria sea un problema real.
- Gestiones millones de objetos similares, como caracteres en un editor de texto o partículas en un juego.
- Quieras usar el agrupamiento de objetos (object pooling) para mejorar el rendimiento.
3. El patrón Proxy Proxy actúa como un sustituto de otro objeto. Se sitúa entre el cliente y el objeto real para controlar el acceso.
Un proxy puede:
- Carga diferida (Lazy load): Cargar imágenes pesadas solo cuando un usuario hace clic en ellas.
- Controlar el acceso: Comprobar si un usuario tiene permiso para eliminar una base de datos.
- Registrar actividad: Rastrear quién utiliza un servicio específico.
- Cachear resultados: Devolver datos guardados en lugar de ejecutar una lógica costosa.
Úsalo cuando:
- Necesites retrasar operaciones costosas.
- Debas proteger un servicio sensible.
- Quieras añadir registro (logging) o seguridad sin cambiar la clase original.
Tabla de resumen
• Adapter: Hace que sistemas incompatibles trabajen juntos. • Bridge: Desacopla la abstracción de la implementación. • Composite: Construye estructuras de árbol. • Decorator: Añade comportamiento sin modificar las clases. • Facade: Simplifica subsistemas complejos. • Flyweight: Comparte datos para ahorrar memoria. • Proxy: Controla el acceso a los objetos.
La regla de oro: Usa estos patrones para que el código sea mantenible. No los uses solo para presumir.
A continuación, comenzamos la serie de Patrones de Diseño de Comportamiento.