只能生成一个实例的类是实现了Singleton模式的类型。
写法一:一次加锁,两次判空
public sealed class Singleton
{
private Singleton()
{
}
private static object syncObj = new object();
private static Singleton instance = null;
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncObj)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
写法二:利用静态构造函数
C#的语法中有一个函数能够确保只调用一次,那就是静态构造函数。我们可以利用这个特性实现单例模式。
public sealed class Singleton
{
private Singleton()
{
}
private static Singleton instance = new Singleton();
public static Singleton Instance
{
get
{
return instance;
}
}
}
这个方法非常简洁,调用静态构造函数的时机不是由程序员掌控的,而是在.NET运行时发现第一次使用一个类型的时候自动调用该类型的静态构造函数,因此实例instance并不是第一次调用属性Singleton.Instance的时候创建,而是在第一次用到Singleton时就会被创建。但是这个方法的缺点是过早地创建实例,从而降低内存的使用效率。
写法三:按需创建实例
public sealed class Singleton
{
private Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
在Singleton中嵌套一个私有类型Nested。当第一次用到这个嵌套类型的时候,会调用静态构造函数创建Singleton的实例instance。第一次调用Singleton.Instance时,会自动调用Nested的静态构造函数创建实例instance。