2013-03-22 24 views
0

雖然我試圖尋找使用私人構造函數,我發現的所有是它在Singleton模式中的使用。 除Singleton模式外什麼是私有構造函數。 一些鏈接或代碼示例將不勝感激。私人構造函數以外的任何其他用途單身模式

+0

沮喪,有沒有「遷移到programmers.stackexchange「選項。我想這在那邊會更好。 – spender 2013-03-22 13:18:55

+1

顯然是工廠模式。一直使用。 – 2013-03-22 13:19:22

+2

http://stackoverflow.com/questions/2585836/why-do-we-need-a-private-constructor?rq=1 – spender 2013-03-22 13:20:24

回答

0

從初始化對象時使用私有構造函數。一個靜態搜索(...)函數後面的DataReader - 這樣的構造函數在公開的時候沒什麼意義。

3

以下是另外兩個原因:

工廠模式。

  • 使用私有構造函數和公共靜態方法來調用它們。

不可變類的Builder模式。

  • 使用嵌套的可變Builder構造類,其中的一個實例被傳遞給一個私有構造函數。

樣品Builder模式:

using System; 

namespace Demo 
{ 
    public static class Program 
    { 
     public static void Main(string[] args) 
     { 
      var demo = new ImmutableClass.Builder{ 
       A = 1, 
       B = "two", 
       C = 3.0 
      }.Build(); 
     } 
    } 

    public sealed class ImmutableClass 
    { 
     public sealed class Builder 
     { 
      public int A; 
      public string B; 
      public double C; 

      public ImmutableClass Build() 
      { 
       return new ImmutableClass(this); 
      } 
     } 

     private ImmutableClass(Builder builder) 
     { 
      _a = builder.A; 
      _b = builder.B; 
      _c = builder.C; 
     } 

     public int A 
     { 
      get 
      { 
       return _a; 
      } 
     } 

     public string B 
     { 
      get 
      { 
       return _b; 
      } 
     } 

     public double C 
     { 
      get 
      { 
       return _c; 
      } 
     } 

     private readonly int _a; 
     private readonly string _b; 
     private readonly double _c; 
    } 
} 
2

快速回答:系列化和鏈構造。

較長的答案:

對象的序列化,需要初始化

public class SomeSerializableClass { 

    private SomeSerializableClass() {} // Used only in serialization 

    public SomeSerializableClass(int initParameter){ 
     this.Property = initParameter; 
    } 

    public int Property { get; set; } 

} 


public class Program{ 

    static void Main(){ 
     var obj1 = new SomeSerializableClass(42); // valid 
     var obj2 = new SomeSerializableClass(); // invalid 

     var xs = new XmlSerializer(typeof(SomeSerializableClass)); 
     var obj3 = (SomeSerializableClass)xs.Deserialize(someStream); // possible 

    } 

} 

連鎖構造函數(因式分解一些構造邏輯)值:

public class SomeClass { 

    private SomeClass(int initParameter) { 
     this.Property = initParameter; // Will always be executed, the logic exists once   
    } 


    public SomeSerializableClass(int initParameter, string otherParameter) 
     : this(initParameter) 
    { 
    } 
    public SomeSerializableClass(int initParameter, int againAntherParameter) 
     : this(initParameter) 
    { 
    } 

    public int Property { get; set; } 

} 
相關問題