It’s singleton, there is only one object, but is injected into many places. (objects are passed by reference to a method)
All your Animal are object pointers referring to the same animal object which is a function in your case.
Your Cat and Dog are objects constructed by this function.