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?