单例数据访问层

时间:2008-10-31 00:59:20

标签: c# design-patterns singleton

在我们的数据访问层工作中,我们有这个标准实现,其中通过单独的公共属性访问类,如下所示:

public static CustomerController Instance
        {
            get 
            {
                lock(singletonLock)
                {
                    if( _instance == null )
                    {
                        _instance = new CustomerController();  
                    }
                    return _instance;
                }
            }
        }

现在,我得到了代码正在做的事情,但我想知道为什么每次使用它时只创建一个类的实例就会这样做?

3 个答案:

答案 0 :(得分:2)

编辑:哦,哎呀我没有抓住“数据访问层”部分。但我也有一个例子:如果您的多线程应用程序通过单例类漏斗所有的数据库调用,则只有一个线程会一次访问数据库,从而避免竞争条件。

如果您在多线程应用程序中有一个日志记录机制,用于吐出所有异常并只写入信息(特别是对于服务或始终运行的应用程序,在发生事件时打印出状态),您将遇到文件锁定问题。我使用单例记录器类,因此只有一个线程可以访问Logger,其余的将等到Logger可以自由地在文本文件中写入它们。

使用单例有很多很酷的理由,但在我遇到多线程应用程序中的文件访问问题之前,我就像你一样,不知道它们是什么。

答案 1 :(得分:1)

您也可以这样做,双重检查锁定,它将加快您对单身人士的访问

 public static CustomerController Instance
        {
                get 
                {
                        if( _instance == null )
                        {
                           lock(singletonLock)
                           {
                                if( _instance == null )
                                {
                                        _instance = new CustomerController();  
                                }

                            }
                        }   
                        return _instance;
                }
        }

答案 2 :(得分:1)

答案很简单:你想在每次使用时获得相同的对象。

它为您提供了作为全局变量(即只有一个)的优势,具有作为类对象的优点(除其他外,它可以在第一次需要时进行无形初始化)。