What is Singleton Pattern
A singleton is a class that allows only a single instance of itself to be created and provides a global point of access.
Advantages
- It provides a single point of access to a particular instance, so it is easy to maintain.
Disadvantages
- This pattern reduces the potential for parallelism within a program, because to access the singleton in a multi-threaded system, an object must be serialized (by locking).
Singleton class vs. Static methods
- A Static Class cannot be extended whereas a singleton class can be extended.
- A Static class is loaded automatically by the CLR when the program containing the class is loaded.
How to Implement Singleton Pattern in your code
eager initialization
public class Singleton
{
private static Singleton instance = new Singleton();
private Singleton() { }
public static Singleton GetInstance
{
get
{
return instance;
}
}
}
lazy initialization
public class Singleton
{
private static Singleton instance = null;
private Singleton() { }
public static Singleton GetInstance
{
get
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
}
thread-safe (Double-checked Locking) initialization
public class Singleton
{
private static Singleton instance = null;
private Singleton() { }
private static object lockThis = new object();
public static Singleton GetInstance
{
get
{
lock (lockThis)
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
}
}
.NET 4's Lazy type
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy =
new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance { get { return lazy.Value; } }
private Singleton()
{
}
}
Real Implementation Example of Singleton pattern
namespace Singleton
{
class Program
{
static void Main(string[] args)
{
Calculate.Instance.ValueOne = 10.5;
Calculate.Instance.ValueTwo = 5.5;
Console.WriteLine("Addition : " + Calculate.Instance.Addition());
Console.WriteLine("Subtraction : " + Calculate.Instance.Subtraction());
Console.WriteLine("Multiplication : " + Calculate.Instance.Multiplication());
Console.WriteLine("Division : " + Calculate.Instance.Division());
Console.ReadLine();
}
}
public sealed class Calculate
{
private Calculate()
{
}
private static Calculate instance = null;
public static Calculate Instance
{
get
{
if (instance == null)
{
instance = new Calculate();
}
return instance;
}
}
public double ValueOne { get; set; }
public double ValueTwo { get; set; }
public double Addition()
{
return ValueOne + ValueTwo;
}
public double Subtraction()
{
return ValueOne - ValueTwo;
}
public double Multiplication()
{
return ValueOne * ValueTwo;
}
public double Division()
{
return ValueOne / ValueTwo;
}
}
}