我经常遇到这样的情况:我想通过传递一些给定的数据或另一个对象来创建对象的实例,但数据或对象需要有效或处于正确的状态。我总是对这样做的“正确”方式有点不清楚。这是我的例子:
给定这个类:
class BusinessObject()
{
const Threshold = 10;
public BusinessObject(SetOfData<SomeType> setofdata)
{
// an example of some validation
if (setofdata.count > Threshold)
{
// performance some business logic
// set properties
}
}
}
如果您这样做,可能会遇到一些问题:
var setofdata = new SetOfData<SomeType>();
// if data is not valid then the object will be created incorrectly
var businessObject = new BusinessObject(setofdata);
所以我的解决方案一直是:
class BusinessObjectBuilder()
{
public BusinessObject Build(SetOfData<SomeType> setofdata)
{
// an example of some validation
if (setofdata.count > Threshold)
return new BusinessObject(setofdata);
}
else
{
return null;
}
}
}
或者将构造函数设为私有并添加静态工厂方法:
class BusinessObject()
{
const Threshold = 10;
public static Create(SetOfData<SomeType> setofdata)
{
if (setofdata.count > Threshold)
{
return new BusinessObject(setofdata);
}
else
{
return null;
}
}
private BusinessObject(SetOfData<SomeType> setofdata)
{
// performance some business logic
// set properties
}
}
理想情况下,如果数据无效,我不希望抛出异常,因为可能在一个流程中创建了多个业务对象,并且如果一个验证失败并且捕获和抑制异常不好,我不希望整个流程失败。
此外,我读到的所有关于抽象工厂或工厂方法的示例都涉及传递某种类型或枚举以及正在构建和返回的正确对象。他们似乎从未涵盖过这种情况。
那么这个场景中的约定是什么?任何建议将不胜感激。