creo que la mayor preocupación que tengo es que el propósito de la fábrica es permitir que el código del cliente cree una instancia derivada de un objeto sin conocer los detalles del tipo que se está creando (más específicamente, los detalles de cómo crear la instancia, pero si se hace correctamente, la persona que llama no debería necesitar conocer ninguno de los más finos) detalles más allá de lo que proporciona la clase base).
El uso de información de tipo extraída del tipo derivado todavía requiere que el llamante tenga un conocimiento íntimo sobre qué tipo quiere crear una instancia, lo que dificulta su actualización y mantenimiento. Al sustituir un tipo Enum (o cadena, int, etc.), puede actualizar la fábrica sin tener que actualizar el código de llamada para conocer los nuevos tipos derivados.
Supongo que se podría argumentar que el nombre de tipo podría leerse como una cadena de un archivo de configuración, base de datos, etc., y la información de tipo determinada usando Reflections (en .NET) o RTTI (en C++), pero Creo que este es un mejor caso para simplemente usar el tipo de cadena como su identificador, ya que efectivamente servirá para el mismo propósito.
¡Definitivamente estoy de acuerdo! Las restricciones de tiempo de compilación son mucho más fáciles de aplicar y más fáciles de usar. – jeremyalan