这真的是一个单身人士吗?

时间:2011-06-09 12:29:44

标签: c# singleton

我有一个像这样的单身人士课。

 class UserInteraction
    {
        private CustomerInformation _loginDetails;
        private MusicDetails[] _musicFilesDownloaded;

        private static volatile UserInteraction _interactionObject = null;
        private static object syncRoot = new Object();
        private UserInteraction()
        {

        }
        public static UserInteraction Instance
        {
           get 
            {
                if (_interactionObject == null) 
                {
                 lock (syncRoot) 
                 {
                     if (_interactionObject == null)
                    _interactionObject = new UserInteraction();
                 }
                }

                return _interactionObject;
            }
        }

        public CustomerInformation UserInfo
        {
            get
            {
                return _loginDetails;
            }
            set
            {

                _loginDetails = value;

            }
        }



        public MusicDetails[] FilesDownloaded
        {
            get
            {
                return _musicFilesDownloaded;
            }

            set
            {
                _musicFilesDownloaded= value;

            }
        }

        public void PurgeContents()
        {

        }
        public void SerializeValues()
        {
        }

    }

我可以使用以下代码访问此单例类

UserInteraction.Instance.UserInfo.CardData = "";

我的问题如下

1)正如您所看到的,我可以读/写UserInfo结构,这意味着我可以使用任意数量的UserInfo副本。这违反了SingleTon的法律吗?

2)如果这违反了Singleton的法律,如何在禁止UserInfo复制的同时为其分配值?

感谢。

5 个答案:

答案 0 :(得分:3)

UserInteraction是一个单身人士。 UserInfo可能不是单身人士。每个AppDomain只能有一个UserInteraction个实例,因此它是一个单例。

你有全局可变状态,这是邪恶的。所以我不会写那样的代码。

我不确定检查锁定检查模式是否可以保证在.net中工作。但是,当你只需在.net 4中使用Lazy<T>时,为什么要使用这样复杂的东西呢? http://csharpindepth.com/Articles/General/Singleton.aspx

答案 1 :(得分:2)

不,这不违反辛格尔顿的“法律”。单例保证,您最多只能拥有某个类的一个实例。你可以改变那个班级的成员并不重要 顺便说一句:有更好的方法来实现单身人士。见这里:http://csharpindepth.com/Articles/General/Singleton.aspx

答案 2 :(得分:1)

这是UserInteraction上的单例,而不是UserInfo上的单例。如果你需要UserInfo是一个单例,那么你需要重构。

答案 3 :(得分:1)

我认为这些将指导您回答自己的问题:

  1. Singleton Pattern (Wikipedia);
  2. The Singleton Design Pattern (Fully explanatory PDF);
  3. Exploring the Singleton Design Pattern
  4. 简而言之,Singleton保证您的系统模块之间只共享一个给定类的实例。也许您应该考虑使UserInfo也成为单身人士吗?这只是设计问题,因为两个不同的开发人员将有多种方法来实现相同的最终行为。

答案 4 :(得分:0)

这是一个单身人士。唯一一个实例。因此,我不认为你有一个有效的问题。

  1. 您可以读取/写入UserInfo部分,但是您正在执行通过单例。
  2. 无效。