Design Patterns 101: The Singleton
Quick, give me an implementation of a Singleton in C# or Java. You should be able to do this in under a minute. Take a break and write down your best implementation of a Singleton. Don't look ahead and give it your best attempt¦ How did you do? Ask yourself the following questions.
- Is your implementation thread safe?
- Is it being initialized lazily?
- Should you prevent inheritance?
- How do you prevent inheritance?
Let's look at the "ideal" C# implementation of a Singleton.
// Singleton
// 3. Yes.
// 4. Class is marked sealed to prevent inheritance.
sealed class Singleton {
// 1. Static members are lazily initialized.
// 2. Static members in .NET are guaranteed to be thread safe.
private static readonly Singleton instance = new Singleton(); // Note: constructor is private.
private Singleton() {}
public static Singleton GetInstance() { return instance; }
}
Knowing how to properly implement the Singleton design pattern in C# reveals important details about how the language works. If you don't prevent inheritance then someone could create a subclass that breaks the intent of having only one instance of a class. So you must be familiar with the sealed keyword. In other languages you have to deal with synchronization issues which you don't have to in C# when using static member variables. C# gives you a lot of bang for your buck.