I would prefer to make IReportEngineFactory an interface and OSGi service instead. We will then have a DefaultReportEngineFactory service that will return the current ReportEngine implementation.
In that case, should we introduce another class that will make it possible to do a static call
ReportEngine re = SomeClass.getEngine(params)
instead of a muti line like
IReportEngineFactory reportFactory = Service.locator().locate(IReportEngineFactory.class).getService();
ReportEngine re = reportFactory.get (getCtx(), ReportEngineFactory.SHIPMENT, getM_InOut_ID(), get_TrxName());
There are about 100 places where an instance of the ReportEngine is required.
You can add one method in org.adempiere.base.Core class. Where we have all such methods.
+1 to Deepak suggestion above.