哪个是创建模型对象的好模式?

时间:2016-06-18 13:24:02

标签: c# design-patterns

在我的应用程序中,我必须使用所有ReferenceData构建一个对象。

class ReferenceData{
{
        public Complex1 Prop1{ get; set; }
        public Complex2 Prop2{ get; set; }
        public Complex3 Prop3{ get; set; }
        public Complex4 Prop4{ get; set; }
}

以上ReferenceData可能有大约30个复杂属性。我想知道最好的模式/方法来创建干净的ReferenceData对象。

1 个答案:

答案 0 :(得分:2)

一个不错的选择是使用Builder模式。

以下是有关该模式的更多信息的链接:http://www.dofactory.com/net/builder-design-pattern

在您的情况下,它可能看起来像这样:

class ReferenceDataBuilder
{
    private Complex1 prop1;
    private Complex2 prop2;
    private Complex3 prop3;

    public ReferenceDataBuilder setProp1 (Complex1 value)
    {
        this.prop1 = value;
        return this;
    }
    public ReferenceDataBuilder setProp2 (Complex2 value)
    {
        this.prop2 = value;
        return this;
    }
    public ReferenceDataBuilder setProp3 (Complex3 value)
    {
        this.prop3 = value;
        return this;
    }

    public ReferenceData make()
    {
        return new ReferenceData(prop1, prop2, prop3);
    }
}

class ReferenceData
{
    public Complex1 Prop1{ get; }
    public Complex2 Prop2{ get; }
    public Complex3 Prop3{ get; }

    public ReferenceData(Complex1 prop1, Complex2 prop2, Complex3 prop3)
    {
        this.Prop1 = prop1;
        this.Prop2 = prop2;
        this.Prop3 = prop3;
    }
}

此设计比您可能已经使用的设计有一些好处。首先,此模式允许您保持ReferenceData不可变,并将构建ReferenceData的所有状态移动到构建器类(它应该只存在足够长的时间以获取ReferenceData的实例)。此外,现在您可以在Builder中使用更清晰的验证代码,以确保在创建ReferenceData实例之前正确设置属性。您还可以为Complex1Complex2Complex3数据类型创建构建器,并将它们与ReferenceData构建器一起使用,以进一步简化实例创建。

您可以像这样使用构建器:

ReferenceData refdata = (new ReferenceDataBuilder())
    .setProp1((new Complex1Builder()).SomeValue("a").build())
    .setProp2((new Complex2Builder()).SomeOtherValue("b"))
    .setProp3("Some third value")
    .build();