Я думаю, что самая большая проблема, которая у меня возникнет, заключается в том, что цель фабрики - позволить клиентскому коду создавать производный экземпляр объекта, не зная деталей создаваемого типа (точнее, деталей того, как создать экземпляр, но если все сделано правильно, вызывающей стороне не нужно знать какие-либо более мелкие детали, кроме того, что предоставляется базовым классом).
Использование информации о типе, извлеченной из производного типа, все еще требует, чтобы вызывающий объект имел некоторые глубокие знания о том, какой тип он хочет создать, что затрудняет его обновление и поддержку. Подставляя тип Enum (или string, int и т. Д.), Вы можете обновить фабрику, не обновляя вызывающий код, чтобы знать о новых производных типах.
Полагаю, можно утверждать, что имя типа может быть прочитано как строка из файла конфигурации, базы данных и т. Д., А информация о типе определена с использованием Reflections (в .NET) или RTTI (в C ++), но я думаю, что это лучший вариант для простого использования строки типа в качестве идентификатора, поскольку она будет эффективно служить той же цели.