The normal way to do this is with virtual constructors. A good example is TComponent which you are no doubt familiar.
TComponent has the following constructor:
constructor Create(AOwner: TComponent); virtual;
The other key to this is TComponentClass which is declared as class of TComponent.
When the VCL streams .dfm files it reads the name of the class from the .dfm file and, by some process that we don't need to cover here, converts that name into a variable, ComponentClass say of type TComponentClass.  It can then instantiate the object with:
Component := ComponentClass.Create(Owner);
This is the big advantage of having a virtual constructor and I would encourage you to take the same approach.
If you have to use a string to identify the class then you'll still need to come up with a lookup routine to convert from the string class name to a class reference.  You could, if convenient, hook into the same VCL mechanism that TComponent uses, namely RegisterClass.
Alternatively if you could replace name in your code with a class reference then you could write:
type
  TFoo = class
    constructor Create; virtual;
  end;
  TBar = class(TFoo);
  TFooClass = class of TFoo;
var
  MyClass: TFooClass;
...
MyClass := TFoo;
result := MyClass.Create;//creates a TFoo;
MyClass := TBar;
result := MyClass.Create;//creates a TBar;