Estas confundiendo lo que un cast puede hacer.
Si has creado un objeto de tipo X, no importa el tipo que sea X, solo lo puedes "mirar" (manipular) como si fuera un objeto de tipo X o cualquiera de sus clases base y las interfaces que implementa.
O sea si X deriva de Y e implementa Z, puedes "mirar" a X como si fuera un X, un Y o un Z.
Lo que ocurre es que:
- Todos las clases tienen como base ultima a la clase Object.
- Algunos metodos dicen que retornaran un Object, lo que es una manera generica de decir que retornaran cualquier tipo de datos.
Pero esto no significa que si creaste un objeto de tipo Object, este pueda ser convertido a un objeto de tipo X. Es solo si fue creado como X que puede ser "mirado" como X.
Cita: Object object = metodo_que_manipula_objeto(); // valido
X objetoX = (X) metodo_que_manipula_objeto(); // solo valido si el objeto manipulado es de tipo X.
Tal vez quieras hacer un new de una clase concreta que sea o bien ComponenteBase o una derivada de esta, en la factoria, para que el cast no te reclame, y crear un objeto de una clase concreta en el metodo de ComponenteBase.