c#在哪种情况下人们会选择单例设计模式

c#在哪种情况下人们会选择单例设计模式,c#,C#,下面是一个单例设计模式代码示例。当人们设计singleton类时,我只是提出了一些新的场景……请提及一些场景 我经常看到人们使用单例设计模式方法开发记录器,但为什么需要这样做,因为我们可以在不使用单例设计模式的情况下开发记录器 如果有人知道真正的原因,请与我分享。谢谢 public sealed class Singleton { Singleton() { } private static readonly object padlock = new objec

下面是一个单例设计模式代码示例。当人们设计singleton类时,我只是提出了一些新的场景……请提及一些场景

我经常看到人们使用单例设计模式方法开发记录器,但为什么需要这样做,因为我们可以在不使用单例设计模式的情况下开发记录器

如果有人知道真正的原因,请与我分享。谢谢

public sealed class Singleton
{
    Singleton()
    {
    }

    private static readonly object padlock = new object();

    private static Singleton instance = null;
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

它归结为应用程序的需要,即是否需要单例。通常,您希望避免使用该模式,因为通常有实例级的方法来完成跨线程共享数据等任务,尽管这样做可能需要编写更复杂的代码

一个例子是跨进程缓存数据库查找。任何实现都是特定于需求应用程序的,尽管它可能不一定是必需的,也就是说,通常有其他方法来实现相同的目标


在SE的软件工程网站上有一个更好的解释,解释了为什么这样做。

Singleton是因为构建对象的成本很高,但是在今天的大多数应用程序架构中,没有太多的空间来容纳四人帮书中描述的Singleton模式。正如您所描述的,单例的“经典”实现使用了静态方法,而静态方法反过来又成为一个主要的依赖磁铁,使得完成IoC变得更加困难。我想不出今天我会使用一个专门编码为单例的对象,而不是传递一个碰巧是唯一构造的对象


今天,我实现Singleton模式所代表的目标的方法是配置我的IoC容器,以便在解析依赖项时仅创建该特定类型的单个实例。

仅供新手参考:上面的实现是线程安全Singleton模式的一个示例。有不同的方法做任何事都有可能。你永远不需要使用singleton模式,但有些人选择使用。我个人认为这是因为你只需要一个logger实例,但同样没有具体的原因说明为什么singleton高于其他任何东西我们在数据库中定义了一些查找表。它们很少改变,当应用程序转到webservice,webservice查询数据库时,会有一点开销。因此,我们将它们作为单例集合加载,并提供一个选项,可根据需要刷新所有这些集合。如前所述,还有其他方法可以做同样的事情,但这是一个实际的单例用例。没有人提到使用单例模式的类对于单元测试来说通常是可怕的,但事实确实如此。