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