Через столько лет об этом спросили, и все ответы, которые я вижу, к сожалению, говорят вам, как вы должны делать свой код вместо того, чтобы давать прямой ответ. Фактический ответ, который вы искали, это иметь ваши классы с закрытым конструктором, но с открытым инстанциатором, что означает, что вы можете создавать только новые экземпляры из других существующих экземпляров ... которые доступны только на фабрике:
Интерфейс для ваших классов:
public interface FactoryObject
{
FactoryObject Instantiate();
}
Ваш класс:
public class YourClass : FactoryObject
{
static YourClass()
{
Factory.RegisterType(new YourClass());
}
private YourClass() {}
FactoryObject FactoryObject.Instantiate()
{
return new YourClass();
}
}
И, наконец, фабрика:
public static class Factory
{
private static List<FactoryObject> knownObjects = new List<FactoryObject>();
public static void RegisterType(FactoryObject obj)
{
knownObjects.Add(obj);
}
public static T Instantiate<T>() where T : FactoryObject
{
var knownObject = knownObjects.Where(x => x.GetType() == typeof(T));
return (T)knownObject.Instantiate();
}
}
Тогда вы можете легко изменить этот код, если вам нужны дополнительные параметры для создания экземпляров или для предварительной обработки созданных вами экземпляров. И этот код позволит вам вызвать создание экземпляра через фабрику, поскольку конструктор класса является закрытым.