Sobes.tech
Junior

Ce este pattern-ul de proiectare Singleton?

sobes.tech AI

Răspuns de la AI

Modelul Singleton garantează că o clasă are o singură instanță și oferă un punct de acces global la aceasta.

Este utilizat atunci când este necesară o singură instanță a unei resurse, de exemplu:

  • Manager de configurare
  • Pool de conexiuni la bază de date
  • Logger

Implementări:

  • Inițializare leneșă (Lazy Initialization): Instanța este creată la prima utilizare.

    public sealed class Singleton
    {
        private static Singleton? instance = null;
        private static readonly object lockObject = new object();
    
        private Singleton() { } // Constructor privat
    
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockObject)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
    
  • Inițializare statică (Eager Initialization): Instanța este creată la încărcarea clasei.

    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();
    
        private Singleton() { } // Constructor privat
    
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }
    

    Avantaj: siguranță în multi-threading implicit, implementare mai simplă. Dezavantaj: instanța este creată chiar dacă nu este utilizată.

  • Utilizând Lazy<T>:.NET Framework oferă suport încorporat pentru inițializarea leneșă.

    public sealed class Singleton
    {
        private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());
    
        private Singleton() { } // Constructor privat
    
        public static Singleton Instance
        {
            get
            {
                return lazyInstance.Value;
            }
        }
    }
    

    Avantaj: siguranță în multi-threading și inițializare leneșă gata de utilizare, cod mai curat.

Avantajele Singleton:

  • Control asupra numărului de instanțe.
  • Punct de acces global.
  • Inițializare leneșă (în unele implementări).

Dezavantaje ale Singleton:

  • Poate încălca principiul responsabilității unice.
  • Îngreunează testarea unitară.
  • Poate duce la o dependență puternică a codului.