0

当我试图搜索私有构造函数的使用时,我发现的只是它在单例模式中的使用。除了单例模式之外,私有构造函数还有什么用处。一些链接或代码示例将不胜感激。

4

3 回答 3

3

这是另外两个原因:

工厂模式。

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

不可变类的构建器模式。

  • 使用嵌套的可变 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;
    }
}
于 2013-03-22T13:21:24.040 回答
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; }

}
于 2013-03-22T13:23:32.023 回答
0

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

于 2013-03-22T13:20:49.373 回答