2016-03-15 35 views
1

當我通過下面的代碼,我無法找到它在示例中使用私有構造函數的原因?私人構造函數在單例設計模式中需要什麼?

public sealed class Singleton 
    { 
     private static Singleton instance = null; 
     private Singleton() 
     { 
     } 

     public static Singleton Instance 
     { 
      get 
      { 
       if (instance == null) 
       { 
        instance = new Singleton(); 
       } 

       return instance; 
      } 
     } 
    } 

...

//Why shouldnt I use something like below. 
    public class Singleton 
    { 
     private static Singleton instance = null;    

     static Singleton() 
     { 
     } 

     public static Singleton Instance 
     { 
      get 
      { 
       if (instance == null) 
       { 
        instance = new Singleton(); 
       } 

       return instance; 
      } 
     } 
    } 

,而不是公共類,如果我創建了一個靜態類,我可以使用類,而不是直接創建實例。 當靜態關鍵字一直存在於同一個工作中時,需要在這裏創建一個私有構造函數嗎?

遵循此模式的其他優點?

+0

https://www.michaelsafyan.com/tech/design/patterns/singleton – Idos

+0

這不是一個單身人士,沒有實例方法。私人構造函數只是防止客戶端代碼創建一個實例(這不需要任何東西)。類的靜態修飾符僅在C#2中引入 - 也許代碼早於此,否則作者不知道它。 –

+0

我已經更新了代碼。 –

回答

0

Singelton爲您提供的工具來實現的接口

Singelton pattren具有廣泛的用途specialy,你必須限制你的應用程序創建只有一個,就像在許多遊戲中,你只有一個實例

3

由於單身人士可以有只有一個實例,你必須防止二次創建。 如果你跳過構造函數聲明,例如

public class clsSingleTon { 
    } 

一個可以調用默認構造函數

var one = new clsSingleTon(); 
    var two = new clsSingleTon(); // <- that's we try to ban 

如果聲明構造函數是公共,可調用它,那麼唯一的選擇就是私人之一:

public class clsSingleTon { 
    public static int intcounter; 

    // No-one will call it 
    private clsSingleTon() { 
    } 
    ... 
    } 

不過,看起來你不想要個所有任何實例,所以下降構造函數和類聲明爲static

// Static class - no instances are allowed 
    public static class clsSingleTon { 
    //TODO: turn it into property 
    public static int intcounter; 

    public static void Hit() { 
    } 

    //TODO: turn it into property, do not mimic Java 
    public static int getTotalHits() { 
     return intCouner; 
    } 
    } 

    ... 

    clsSingleTon.Hit(); 
    MessageBox.Show(clsSingleTon.getTotalHits().ToString()); 
+0

對不起..我不清楚你想傳達什麼..我的問題是創建一個靜態類而不是私有構造函數是錯誤的。正是你在最後一個片段中所做的。 –

+0

@Ammu:在你當前的實現中(取自Java?)你*沒有靜態類(Java不允許靜態類),因此防止實例創建的唯一選擇是隱藏構造函數。在C#*靜態類*是最好的實現(無*鍋板*代碼);另一個問題是結合'intcounter'和'getTotalHits()'到*屬性* –

+0

@ Dmitry Bychenko結合intcounter和getTotalHits的需要是什麼?爲什麼我不能像你在答案中提到的那樣使用相同的方式? –

0

有一個私人的構造函數,因此只能在類中調用。然後你將不得不定義一個靜態方法來'鎖定'你的類並實例化它。

2

單例類和靜態類是不同的東西,看起來你正在混合起來。靜態類只有靜態方法和靜態成員,因此不能有構造函數。在類型上調用靜態方法,而不是實例。

相比之下,單例類具有普通的方法,並使用實例調用。私有構造函數用於防止創建該類的多個實例,並且通常由返回此唯一實例的私有屬性使用。

public class Singleton 
{ 
    static Singleton s_myInstance = null; 
    private Singleton() 
    { 
    } 

    // Very simplistic implementation (not thread safe, not disposable, etc) 
    public Singleton Instance 
    { 
     get 
     { 
      if (s_myInstance == null) 
        s_myInstance = new Singleton(); 
      return s_myInstance; 
     } 
    } 
    // More ordinary members here. 
} 

單身人士的好處是他們可以實現接口。另外,如果它們是有狀態的(有許多成員),它們應該優於靜態類,因爲靜態類中的許多靜態字段是非常醜陋的設計。

+0

請注意,你的實現是最簡單的,因此不是線程安全的,或者提供一個標準的線程安全版本。 –

+1

好的。這個問題非常基本,我認爲更喜歡真正的基本實現。 – PMF

+0

爲什麼不能在你給出的代碼中使用靜態構造函數作爲例子?也只會調用一次。 –

0

在理想的OOP世界中,您應該有沒有靜態類。這是因爲:

您不能擁有靜態類的實例。這僅僅違背了大多數OOP原則和設計模式。只需打開一個list of design patterns,逐一瀏覽它們,然後問自己 - 我可以在沒有課程實例的情況下做到這一點嗎?如果答案是否定的 - 在靜態類上使用單例模式有優勢。


至於使用私人構造函數 - 閱讀answer by Dmitry Bychenko

相關問題