我曾经使用singleton获取单个实例,但由于测试中的一些缺点而被其他人放弃。缺点是什么? 有没有其他好的方法来获取全局实例?
那么我可以在应用程序中只创建一个单例类 Global 作为全局中心吗?这样我就可以将任何其他类的单个实例放入 Global.Instance 中。
最佳答案
好吧,为什么单例不好,你可以在这里阅读:What is so bad about singletons?
专门用于测试:典型的单例模式如下所示
class MyClass
{
private static MyClass m_Instance = new MyClass();
public static MyClass Instance
{
get { return m_Instance; }
}
}
现在假设您必须运行一大堆测试,所有测试都涉及 MyClass.Instance
。这个类带有一个状态,您通常需要有一种方法在测试之间重置它,以便每个测试都可以从一个干净的初始状态开始。现在您可以添加 Reset()
方法,但这意味着您向类中添加代码只是为了能够测试它,这是不可取的。
用什么代替:嗯,单例本身并不是什么坏事。它导致的问题是它使得编写这样的代码变得很容易:
class SomeClass
{
public void SomeMethod()
{
...
MyClass.Instance.DoSomething();
}
}
现在您已经创建了对单例实例的隐式依赖关系,您无法轻易破坏它。解决这个问题的一种方法是通过依赖注入(inject)(已经提到过):
class SomeClass
{
public SomeClass(MyClass myClass)
{
m_MyClass = myClass;
}
public void SomeMethod()
{
...
m_MyClass.DoSomething();
}
}
你可以这样做:
var someClass = new SomeClass(MyClass.Instance);
在你的程序中并且
var someClass = new SomeClass(new MyClass());
用于测试。
所以单例并没有那么糟糕,有时它是完成正确工作的正确工具,但是您需要小心如何使用它们。
关于c# - 任何获取单个实例而不是使用 Singleton 的好方法(在 C# 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5776261/