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
  1. Asegurar que una clase tenga exactamente una instancia.
  2. 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 Instance que 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