一、网上大多数写的典型 错误 例子
public class Singleton<T> where T : new() //where T : new()
{
private static T _instance;
public static T GetInstance()
{
if (_instance == null)
{
_instance = new T();
}
return _instance;
}
}
//使用方式
public class XXXX : Singleton<XXXX>
{
public XXXX()
{
}
}
这是错误的,单例嘛,最最基本的就是构造函数的访问入口有且只能有一个,就是通用GetInstance(),以上方法因为必需要一个公共的构造,完全违背了单例。比较正确的方式如下
using System;
using System.Reflection;
public class DyhSingleton<T> where T : class
{
private static T instance;
private static object initLock = new object();
public static T GetInstance()
{
if (instance == null)
CreateInstance();
return instance;
}
private static void CreateInstance()
{
lock (initLock)
{
if (instance == null)
{
Type t = typeof(T);
// Ensure there are no public constructors...
// 这里确保没有其它的public构造函数了,既没有可以通过其它方法new这个类
ConstructorInfo[] ctors = t.GetConstructors();
if (ctors.Length > 0)
{
throw new InvalidOperationException(String.Format("{0} has at least one accesible ctor making it impossibleto enforce DyhSingleton behaviour", t.Name));
}
// Create an instance via the private constructor
instance = (T)Activator.CreateInstance(t, true);
}
}
}
}
//使用方式
public class XXXX : DyhSingleton<XXXX>
{
private XXXX()//这里就可以用private了
{
}
}