c# - 任何获取单个实例而不是使用 Singleton 的好方法(在 C# 中)

标签 c# singleton

我曾经使用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/

相关文章:

ios - 无法保存与扩展程序共享的网址

java - scala 对象单例中的方法不是静态的?

c# - RenderTargetBitmap 模糊

c# - 在 MVC3 应用程序的编辑操作方法中使用 AutoMapper

c# - 某些操作后调用 pageload

c# - WatiNTestRecorder 是否生成 C# 等效代码或仅生成格式化为模型的对象

c++ - 单例类无法处理多个文件

c++ - 单例模式析构函数 C++

c# - 将缩进文本转换为 XML

c++ - 需要在 Singleton 类中私有(private)化赋值运算符