I beg to differ here. The factory is a perfect layer between CREATEOBJECT() and the actual return of an object. That means the factory could have the logic to what exact object is returned.
So for example if I do
oObject = oFactory.Makeobject("ReportEngine")
Its the factory that decides whether MS word, Excell, Cyrstal Reports, VFP Reports or anything else is used as report engine.