【发布时间】:2013-05-14 10:18:03
【问题描述】:
我经常遇到这样的情况:我想通过传递一些给定的数据或另一个对象来创建对象的实例,但数据或对象需要有效或处于正确的状态。我总是对这样做的“正确”方式有点不清楚。这是我的例子:
鉴于这个类:
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
}
}
理想情况下,如果数据无效,我不希望抛出异常,因为在一个流程中可能会创建多个业务对象,并且如果一个验证失败并且捕获和抑制异常,我不希望整个流程失败不好。
此外,我读到的所有抽象工厂或工厂方法的示例都涉及传递某种类型或枚举以及正在构建和返回的正确对象。他们似乎从未涵盖过这种情况。
那么在这个场景中的约定是什么?任何建议将不胜感激。
【问题讨论】:
-
请注意,工厂并不需要传入“某种类型或枚举”;他们可以获取任何类型的数据(甚至是
SetOfData<SomeType>)或根本没有数据(无参数)。这些示例倾向于使用它们,因为这是使用/描述它们的一种相当常见/简单的方式。如果您愿意,您始终可以为工厂创建一个BusinessObjectValidator以利用它来检查参数,但如果检查像您描述的那样简单,我会尽快将其放入工厂创建方法中。
标签: c# java design-patterns