Недавно я думал о том, чтобы защитить некоторые из моего кода. Мне любопытно, как можно было бы убедиться, что объект никогда не может быть создан напрямую, но только с помощью некоторого метода класса factory. Скажем, у меня есть класс "бизнес-объект", и я хочу убедиться, что любой экземпляр этого класса будет иметь правильное внутреннее состояние. Для этого мне нужно будет выполнить некоторую проверку перед созданием объекта, возможно, в его конструкторе. Все в порядке, пока я не решила, что хочу сделать эту проверку частью бизнес-логики. Итак, как я могу организовать создание бизнес-объекта только с помощью какого-либо метода в моем классе бизнес-логики, но никогда напрямую? Первым естественным желанием использовать старое "дружеское" ключевое слово С++ будет не хватать С#. Поэтому нам нужны другие варианты...
Попробуем пример:
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 напрямую, не проверяя ввод. Я хотел бы вообще исключить эту техническую возможность.
Итак, что думает об этом сообщество?