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