使用new构建对象的单例模板
public class Singleton<T> where T : Singleton<T>, new()
{
private static volatile T instance;
private static readonly object syncRoot = new object();
public static T GetInstance()
{
if (instance is null)
{
lock(syncRoot)
{
if (instance is null)
{
instance = new T();
}
}
}
return instance;
}
}
在原有的单例模板中,由于使用的new来构建对象,并且因为是泛型模板,所以必须要带有泛型约束new()。确保子类有公有的无参构造函数,才能正常的进行new。
但是这样做会带来一个问题,在外界可以通过new的方式来构建子类的对象,或者直接通过基类来new出对象
- 可以向基类更改成为抽象类,或者将构造函数改为保护类型。抽象类无法直接构建实例,而保护类型的构造函数确保只有子类才能访问
-
public class abstract Singleton<T> where T : Singleton<T>, new()
-
- 不使用new()约束,通过反射来获取构造函数
-
public class abstract Singleton<T> where T : Singleton<T> { private static volatile T instance; private static readonly object syncRoot = new object(); public static T GetInstance() { if (instance is null) { lock(syncRoot) { if (instance is null) { Type type = typeof(T); ConstructorInfo info = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, Type.EmptyTypes, null); if (info != null) { instance = info.Invoke(null) as T; } } } } return instance; } }
通过 绑定标识 枚举来选择非公有 通过位或 结合实例类型 来获取到子类中私有类型的构造函数
个人阶段里的一些总结,仅供参考