2013-08-01 128 views
2

我已經聲明瞭一個具有受保護構造函數的單例類,並在其他類中派生出來。因此,派生類實例可以是單例類或非單類類。Singleton類的繼承

是否有辦法保持派生類也是單身人士?

+3

你爲什麼要那樣做? –

+0

這是可能的,直到你的課程不被'密封' – wudzik

+0

這是由開發人員創建/使用派生類。如果你真的不相信他們,那麼不要讓他們繼承你的班級。 – aroth

回答

0

通常Singleton類是密封的(將阻止繼承),所以派生類不會破壞Singleton。

但是,如果你必須從類派生,那麼派生類可以選擇作爲單例實現。但是你不能僅僅使用繼承過程來執行它。

0

這取決於實施。單身人士通常有私人構造函數,並可能被標記爲密封,如果單身人士類具有私人構造函數,你將無法繼承它。如果它至少受到保護,你可以。如果你只是從單例類繼承,結果將不會是單例,所以你應該遵循該模式,並使其也是單例。

2

這裏是不錯的線程安全的單例類的列表,我使用:

namespace Helpers.DesignPatterns 
{ 
public class Singleton<T> where T : class 
{ 
    private static volatile T _instance; 
    private static object _syncRoot = new Object(); 

    protected Singleton() 
    { 
    } 

    private static T CreateInstance() 
    { 
     ConstructorInfo cInfo = typeof(T).GetConstructor(
      BindingFlags.Instance | BindingFlags.NonPublic, 
      null, 
      new Type[0], 
      new ParameterModifier[0]); 

     return (T)cInfo.Invoke(null); 
    } 

    /// <summary> 
    /// Точка входа синглтона 
    /// </summary> 
    public static T Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       lock (_syncRoot) 
       { 
        if (_instance == null) 
         _instance = CreateInstance(); 
       } 
      } 

      return _instance; 
     } 
    } 
    } 
} 

它的極端簡單的創建derieved類:

class CredentialsManager : Singleton<CredentialsManager>

但通常它不是一個很好的解決方案在項目中擁有超過1個單例類。我有4我的:)

+0

+祖國祖國 – Alex