Yo tiro por la tangente.
Yo, a veces, tengo dos métodos de clase, dos procedimiento llamados "Instanciar" y "Liberar", en ellos hago lo siguiente:
Código Delphi
[-]
class procedure TObj.Instanciar(var Param: TParam; var pObj; TObj);
begin
Liberar(pObj);
pObj := TObj.Create(Param);
end;
class function TObj.Liberar(var pObj: TObj);
begin
if Assigned(pObj) then
FreeAndNil(pObj);
end;
A esta forma de trabajar, para que se parezca a la tuya bastaría con cambiar el "Instanciar" y realizar lo siguiente
Código Delphi
[-]
class procedure TObj.Instanciarr(var Param: TParam; var pObj; TObj);
begin
Liberar(pObj);
if TObj.ValidarParam(Param) then pObj := TObj.Create(Param);
end;
Se me olvidaba la llamada:
Código Delphi
[-]
begin
TObj.Instanciar(Param, Obj);
end;
La opción "TryCreate" no me parece mal tampoco.