最近,我一直在考虑保护我的一些代码。我很好奇如何确保一个对象永远不能直接创建,而只能通过工厂类的某种方法来创建。让我们说我有一些“业务对象”类,并且我想确保该类的任何实例都具有有效的内部状态。为了实现这一点,我将需要在创建对象之前(可能是在其构造函数中)执行一些检查。没关系,直到我决定我要使此检查成为业务逻辑的一部分。因此,如何安排业务对象只能通过我的业务逻辑类中的某种方法创建而不能直接创建?使用C ++的旧“ friend”关键字的第一个自然愿望将与C#脱节。所以我们需要其他选择...
让我们尝试一些示例:
public MyBusinessObjectClass
{
public string MyProperty { get; private set; }
public MyBusinessObjectClass (string myProperty)
{
MyProperty = myProperty;
}
}
public MyBusinessLogicClass
{
public MyBusinessObjectClass CreateBusinessObject (string myProperty)
{
// Perform some check on myProperty
if (true /* check is okay */)
return new MyBusinessObjectClass (myProperty);
return null;
}
}
没关系,直到您记住仍然可以直接创建MyBusinessObjectClass实例,而无需检查输入。我想完全排除这种技术可能性。
那么,社区对此有何看法?
CreateBusinessObject
方法的目的是在调用者不立即知道参数是否有效传递给构造函数时,在单个方法调用中验证参数AND(返回一个新的有效对象或返回一个错误)。
Distance
带有负参数的实例应该抛出一个ArgumentOutOfRangeException
例子,如果创建一个DistanceFactory
执行相同检查的实例,您将一无所获。我仍然看不到你将在这里获得什么。