我有一个需要成为单例的类,所以我开始按照这些思路实现一些东西(我不记得我的确切代码,但这是 wiki 演示实现)
public class Singleton
{
private static Singleton instance = null;
private Singleton(){}
public static Singleton GetInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
最近在进行代码审查时,我的老板说这不合适,并为我提供了以下课程:
public class Unique<T>
where T :class, new()
{
private static object _syncRoot = new Object();
private static volatile T _instance;
// private constructor
Unique() { }
// creates the new instance on the first call
public static T Instance
{
get
{
if (_instance == null)
{
lock (_syncRoot)
{
if (_instance == null)
_instance = new T();
}
}
return _instance;
}
}
}
有了这个,我写Unique<Singleton>.Instance
来获取任何类的单个实例。然后他回过头来改变我的班级,不实现单例模式。问题是,这个类对于维护数据以在 UI 上显示是不可或缺的,他知道这一点。但是现在任何人都可以来写var x = new Singleton();
这会完全弄乱用户界面。我不能将Singleton
' 的构造函数设为公开,因为通过它访问它Unique
不起作用。
所以,我理解他的泛型类的力量和灵活性,这很酷,但似乎不安全。我错过了什么吗?
没有语言标记,因为我认为这是一个更广泛的、独立于语言的问题,但发布的代码是 C#。
编辑; 实际上,我只是测试了如果我创建了一个新的类实例会发生什么并且它没有破坏 UI,但是如果有人从我那里继承了这个项目并且不知道它,他们可能会对为什么他们感到困惑重新写入这个特定的类并且数据没有显示出来。