2011-06-09 64 views
1

我有這樣的單身課。這真的是一個單身人士嗎?

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() 
     { 
     } 

    } 

我可以使用下面的代碼來訪問此singleton類

UserInteraction.Instance.UserInfo.CardData = ""; 

我的問題如下

1)正如你可以看到我可以讀取/寫入的UserInfo結構,即意味着我可以任意數量的UserInfo副本。這是否違反SingleTon的法律? 2)如果這違背了Singleton的規律,我怎麼能在同一時間禁止UserInfo的重複賦值呢?

謝謝。

+1

+1有趣的架構/設計問題。 =) – 2011-06-09 12:40:52

回答

2

不,這不違背辛格爾頓的「規律」。一個單身人士保證,你最多隻有一個特定類別的實例。你可以改變那個班的成員並不重要。
順便說一句:有更好的方法來實現一個單身人士。看到這裏:http://csharpindepth.com/Articles/General/Singleton.aspx

0

這是一個單身人士。一次也是唯一一次。因此它不違反法律,我不認爲你有一個有效的問題。

  1. 你可以讀/寫用戶信息部分,但你這樣做通過單身。
  2. 無效。
3

UserInteraction是一個單身人士。 UserInfo可能不是單身人士。每個AppDomain只能有一個UserInteraction實例,所以它是一個單例。

你有全局可變的狀態,這是邪惡的。所以我不會寫這樣的代碼。

我不確定檢查鎖定檢查模式是否可以在.net中工作。但是,當你可以簡單地在.net 4中使用Lazy<T>時,爲什麼使用這樣複雜的東西呢? http://csharpindepth.com/Articles/General/Singleton.aspx

+0

因爲我們沒有使用。net 4 :) – logeeks 2011-06-09 12:36:06

+0

看起來您的代碼不能保證在其他CLI實現上正常工作,因爲ECMA內存模型比.net 2.0模型更弱。 – CodesInChaos 2011-06-09 12:39:00

1

這是UserInteraction的單例,而不是UserInfo。如果你需要UserInfo是一個單身人士,那麼你需要重構。