假设我们必须创建具有一些预定义(默认)值的复杂 DTO 对象。该对象用于序列化,序列化器需要无参数构造函数。为此,我想使用静态工厂方法,但我对这种方法的正确使用有些怀疑。
请考虑以下两个示例:
public class Foo
{
public void DoSomething()
{
// the first way of creating the object
var addressDtoFirstWay = AddressDtoFirstWay
.CreateWithPredefinedValues();
addressDtoFirstWay.StreetName = "Street";
addressDtoFirstWay.HouseNumber = 100;
addressDtoFirstWay.PostalCode = "1000";
// the second way of creating the object
var addressDtoSecondWay = AddressDtoSecondWay
.CreateWithPredefinedValues("Street", 100, null, "1000");
}
}
public class AddressDtoFirstWay
{
public string RecipientName { get; set; }
public string StreetName { get; set; }
public int HouseNumber { get; set; }
public int? FlatNumber { get; set; }
public string PostalCode { get; set; }
public string City { get; set; }
public string CountryName { get; set; }
public static AddressDtoFirstWay CreateWithPredefinedValues()
{
return new AddressDtoFirstWay
{
RecipientName = "John Doe",
City = "City",
CountryName = "Country"
};
}
}
public class AddressDtoSecondWay
{
public string RecipientName { get; set; }
public string StreetName { get; set; }
public int HouseNumber { get; set; }
public int? FlatNumber { get; set; }
public string PostalCode { get; set; }
public string City { get; set; }
public string CountryName { get; set; }
public static AddressDtoSecondWay CreateWithPredefinedValues(
string streetName,
int houseNumber,
int? flatNumber,
string postalCode)
{
return new AddressDtoSecondWay
{
RecipientName = "John Doe",
StreetName = streetName,
HouseNumber = houseNumber,
FlatNumber = flatNumber,
PostalCode = postalCode,
City = "City",
CountryName = "Country"
};
}
}
在第一个示例中,工厂方法仅初始化预定义字段 - 用户必须在对象创建后初始化其余字段。第二个示例初始化预定义的字段,也是必需的字段,但作为缺点,用户必须填写可为空的(在这种情况下不需要,但在其他情况下是必需的)字段flatNumber
。
我看到了这两种解决方案的优点和缺点,但我正在考虑哪一种更受欢迎以及为什么。也许其他一些方法会更好。我愿意接受任何建议,但我想指出,构建器模式适用的问题并不复杂。