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

本文关键字:构造函数 任何 单例模式 其他 | 更新日期: 2023-09-27 18:05:23

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

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

还有两个原因:

Factory Pattern.

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

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

快速回答:序列化和链式构造函数。

较长的回答:

需要初始化值的对象的序列化

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; }
}

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