Feels a bit strange that the interface is returning objects of the same type.
I'd prefer a clean separation of factory and product