除了单例模式之外的任何其他私有构造函数的使用

时间:2013-03-22 13:16:49

标签: c# asp.net

虽然我试图搜索私有构造函数的使用,但我发现它只是在Singleton模式中使用。 除了Singleton模式,使用Private Constructor是什么。 一些链接或代码示例将不胜感激。

3 个答案:

答案 0 :(得分:3)

以下是另外两个原因:

工厂模式。

  • 使用私有构造函数和公共静态方法来调用它们。

不可变类的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;
    }
}

答案 1 :(得分: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; }

}

答案 2 :(得分:0)

我在初始化对象时使用私有构造函数。一个静态搜索(...)函数背面的DataReader - 如果是公共的话,这样的构造函数就没什么意义。