If the impl class can't be instantiated at first then we need a mechanism to change the impl class and attempt to reinstantiate it. So for eg. a wrong system property was provided and the class couldn't be instantiated then the system property could be corrected and reinstantiation attempted again. Another point is that if we go for eager initialization then we need to store the reason why the instantiation failed and then throw this exception back each time the factory method is called.