The reason there are two macros is because the factory design pattern fixes the number of arguments that a constructor can have. Classes derived from uvm_object have constructors with one argument, a string name. Classes derived from uvm_component have two arguments, a name and a uvm_component parent. The two `uvm_*utils macros inserts code that gives you a factory create() method that delegates calls to the constructors of uvm_object or uvm_component. You need to use the respective macro so that the correct constructor arguments get passed through. This means that you cannot add extra constructor arguments when you extend these classes in order to be able to use the UVM factory.
credit : https://www.quora.com/What-is-the-difference-between-uvm_object_utils-and-uvm_component_utils-How-should-these-macros-be-used-in-a-testbench
credit : https://www.quora.com/What-is-the-difference-between-uvm_object_utils-and-uvm_component_utils-How-should-these-macros-be-used-in-a-testbench