我经常遇到这样的情况,我想通过传递一些给定的数据或可能是另一个对象来创建对象的实例,但数据或对象需要有效或处于正确的状态。我在做这件事的'正确'方式上总是有点不清楚。这是我的例子:什么设计模式用于验证数据和创建对象
鉴于这种类:
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;
}
}
}
或者使构造函数为private并添加静态工厂方法:
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”)或根本没有数据(无参数)。这些示例倾向于使用它们,因为它是使用/描述它们的相当常见/简单的方式。如果你愿意的话,你总是可以为工厂创建一个'BusinessObjectValidator'来利用它来检查这些参数,但是如果检查如你所描述的那样简单,我就尽快将它放到工厂创建方法中。 –
2013-05-14 10:38:44