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?