Przejdź do treści

DevStyle - Strona Główna
Prosty Singleton
Backend

Rekomendowana implementacja wzorca Singleton w C# wygląda tak (plus oczywiście prywatny konstruktor):

  1:  private static object _lock = new object();
  2:  private static Singleton _instance;
  3:  public static Singleton Instance
  4:  {
  5:  	get
  6:  	{
  7:  		if (_instance == null)
  8:  		{
  9:  			lock (_lock)
 10:  			{
 11:  				if (_instance == null)
 12:  				{
 13:  					_instance = new Singleton();
 14:  				}
 15:  			}
 16:  		}
 17:  		return _instance;
 18:  	}
 19:  }

Czy jednak nie można zawrzeć całego tego “szumu” w jednej linijce kodu?

  1:  public static readonly Singleton Instance = new Singleton();

Cechy współdzielone z implementacją pierwszą:

– spełnione założenia Singletona: jedna, dostępna globalnie instancja

– bezpieczna wielowątkowość

Zalety:

– jedna banalnie prosta linijka kodu

Wady:

– możliwa inicjalizacja przed pierwszym faktycznym wykorzystaniem instancji

Z tej implementacji korzystam od dawna i… czy coś mi umknęło? Teoretyczne odłożenie procesu tworzenia obiektu kosztuje nas 18 linii kodu? W ogromnie przeważającej większości przypadków czytelność i mniejsza ilość kodu są z pewnością ważniejsze. A może jednak nie zauważam jakiejś oczywistości?

Zobacz również