hmmm.. warum einen String für die Unterscheidung verwenden? Eine Elternklasse von der konkrete Implementierungen abgeleitet sind erscheinen mir an der Stelle zweckmäßiger...
Worauf Dich SirRufo hinweisen will ist, dass Du eine harte Kopplung zwischen Implementierung und Factory hast (in dem GetFillData eine konkrete Klasse benötigt). Das Ziel ist ja, dass der Factory-Nutzer nicht wissen muss welche Implementierung hinter dem Interface IFillData steckt.
Des Weiteren macht eine Basisklasse TPDFFillData, die lediglich das Interface IFillData implementiert und die zu implementierenden Methoden als abstract an seine Spezialisierungen weitergibt, so auch keinen Sinn. Ein Interface definiert eine gemeinsame Schnittstelle und eine Klasse eine gemeinsame Vorgehensweise. Die gemeinsame Vorgehensweise ist hier m.E. nicht gegeben und so sollte jede Deiner Implementierungen selbst das Interface IFillData implementieren - eine Vererbungshierarchie ist hier Fehl am Platz.