Ja, prinzipiell geht das schon.
Ich würde aber nie 'hart' casten (also TMyForm4711(Form).blafasel ) sondern immer nur 'weich' : (Form as TMyForm4711).blafasel
Das hat den Vorteil, daß Dir der Compiler Fehlermeldungen gibt, wenn Du etwas hast, das sich nicht als TMyForm4711 casten lässt.
Was den Pointer angeht: Du kannst ja neben FormFactory.GetForm (das direkt instanziert) noch ein FormFactory.GetClass implementieren, das Dir den Pointer direkt durchreicht.
So bist Du
imho ein wenig flexibler. Allerdings hab ich bisher für sowas noch keine Anwendung gefunden.