c#设计模式Singleton
一个常规的Single模式,只能创建一个实例,即使创建多个都是对同一个的引用,如下实现:
using System;
class Singleton
{
private static Singleton _instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
}
class test
{
public static void Main()
{
Singleton a = Singleton.Instance;
Singleton b = Singleton.Instance;
Console.WriteLine(Object.ReferenceEquals(a, b).ToString());
}
}
上面的代码是单线程的,因为在多线程中容易产生多个实例,问题就在如下三行代码之间产生:
if (_instance == null)
{
_instance = new Singleton();
因此,对于多线程的Singleton模式如下:
using System;
class Singleton
{
private static volatile Singleton _instance = null;
private static object lockHelper = new object();
private Singleton(){}
public static Singleton Instance
{
get
{
if (_instance == null)
{
lock(lockHelper)
{
if(_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
}
class test
{
public static void Main()
{
Singleton a = Singleton.Instance;
Singleton b = Singleton.Instance;
Console.WriteLine(Object.ReferenceEquals(a,b).ToString());
}
}
对此感觉设计挺好,后来听说有人用更简单的方法实现:
sing System;
class Singleton
{
public static readonly Singleton Instance = new Singleton();
private Singleton(){}
}
class Test
{
public static void Main()
{
Singleton a = Singleton.Instance;
Singleton b = Singleton.Instance;
Console.WriteLine(object.ReferenceEquals(a,b).ToString());
}
}
恩。。。确实不错!不过,还是有点疑惑的是:总觉得那个readonly加不加无所谓!
还有一点值得明确指出加以备忘的是:程序中public static readonly Singleton Instance = new Singleton();所调用的构造函数Singleton()并不是下面所声明的private Singleton(){}, 因为编译器是这样处理的,对于静态的属性是用静态构造函数来实现的,这个静态构造函数是编译器自动生成的,关于这个用ildasm反汇编即可看出。对于private Singleton(){}在程序中并没有调用,它的作用是用来屏蔽系统自动生成构造函数功能,以防止用户new新实例。
浙公网安备 33010602011771号