单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类成为单例类,它提供全局访问的方法。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
实现一:普通单例模式
using System;
using System.Collections.Generic;
using System.Text;
namespace 单例模式
{
class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton GetInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if (s1 == s2)
Console.WriteLine("两个对象是相同的实例!");
Console.Read();
}
}
}
实现二:多线程时的单例模式,双重锁定
using System;
using System.Collections.Generic;
using System.Text;
namespace 双重锁定单例模式
{
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object();
private Singleton()
{
}
public static Singleton GetInstance()
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if (s1 == s2)
Console.WriteLine("两个对象是相同的实例!");
Console.Read();
}
}
}
实现三:静态初始化单例模式
C#与公共语言运行库提供的“静态初始化”方法,不需要开发人员显式地编写线程安全代码,即可解决多线程环境下它是不安全的问题【MSDN】
这种静态初始化的方式是在自己被加载时就将自己实例化,所以被形象地称之为饿汉式单例模式。
之前的单例模式要在第一次被引用时,才会将自己实例化,称为懒汉式单例模式。
using System;
using System.Collections.Generic;
using System.Text;
namespace 静态初试化
{
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
private Singleton() { }
public static Singleton GetInstance()
{
return instance;
}
}
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if (s1 == s2)
Console.WriteLine("两个对象是相同的实例!");
Console.Read();
}
}
}