Patrón Singleton
El patrón Singleton asegura que una clase tenga solo una instancia y proporciona un punto de acceso global a ella. Úsalo cuando necesites exactamente un objeto para coordinar acciones en todo el sistema, como un gestor de configuración, logger o pool de conexiones.
Resumen
El patrón Singleton restringe una clase a una sola instancia y expone un punto de acceso global a ella. Es uno de los patrones creacionales más simples, pero también de los más discutidos porque introduce estado global en el sistema. Usado con criterio para recursos que realmente deben existir una sola vez —un store de configuración, un logger, un pool de conexiones— elimina el ruido de pasar la misma referencia por todos lados y garantiza consistencia.
Cuándo usarlo
- Necesitas exactamente una instancia de un recurso compartido en toda la aplicación (config, logger, cache).
- Crear la instancia es costoso y quieres diferirlo hasta el primer uso (inicialización perezosa).
- Quieres una única fuente de verdad accesible sin tener que cablear inyección de dependencias.
Ejemplo
class Logger {
private static instance: Logger;
private constructor() {}
static getInstance(): Logger {
if (!Logger.instance) {
Logger.instance = new Logger();
}
return Logger.instance;
}
log(message: string) {
console.log(`[${new Date().toISOString()}] ${message}`);
}
}
Logger.getInstance().log("App iniciada");Ventajas
- Garantiza una sola instancia y un único punto de acceso.
- La inicialización perezosa evita pagar el costo hasta que realmente se necesita.
- Reemplaza variables globales ad-hoc por un ciclo de vida encapsulado y controlado.
Desventajas
- Introduce estado global, lo que complica los tests unitarios y la concurrencia.
- Oculta dependencias — los consumidores acceden al singleton en lugar de declarar lo que necesitan.
- Puede convertirse en cuello de botella o memory leak si vive durante todo el proceso.