Singleton
Garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a ella.
Contexto
En tu aplicación necesitas un objeto que orqueste un recurso compartido — una conexión de logging, un cache en memoria, una configuración global — y crear varias copias provocaría inconsistencias.
Problema
- Asegurar que una clase tenga exactamente una instancia.
- Proveer un punto de acceso global a esa instancia, sin recurrir a variables globales sueltas.
Solución
Hacer privado el constructor y exponer un método estático que devuelva siempre la misma instancia, creándola perezosamente la primera vez.
#Estructura
- Constructor privado.
- Campo estático que guarda la instancia única.
- Método estático
Instanceque la devuelve.
#Ejemplo en C#
public sealed class Logger
{
private static readonly Lazy<Logger> _instance = new(() => new Logger());
public static Logger Instance => _instance.Value;
private Logger() { }
public void Log(string message) =>
Console.WriteLine(quot;[{DateTime.UtcNow:O}] {message}");
}
// Uso
Logger.Instance.Log("Aplicación iniciada");
Lazy<T>resuelve el problema de inicialización perezosa y es thread-safe por defecto (ExecutionAndPublication).
Cuándo NO aplicarlo
- Cuando solo lo usas para evitar pasar dependencias → estás escondiendo acoplamiento. Prefiere inyección de dependencias.
- Cuando hay que testear: un Singleton dificulta los mocks. Encapsúlalo detrás de una interfaz.
- En entornos multi-tenant donde necesitas una instancia por contexto.
Tradeoffs
| Pro | Contra |
|---|---|
| Garantiza unicidad | Estado global encubierto |
| Inicialización perezosa | Dificulta tests unitarios |
| Punto de acceso claro | Acoplamiento implícito a quien lo invoca |
#Variantes
Mira las variantes en el menú lateral: thread-safe (manual) y enum-like de solo lectura.
#creational #gof #instance #global