"...you could imagine a more complex problem where the appropriate factory object is returned and then used by the caller to create an object in a
more sophisticated way."
I'm not clear what the advantages of this are, other than for administrative things such as reference-counting.
Could you describe more (or illustrate with an example)?
Do you mean that the usual one-one relationship between a class and its factory/init method might be broken (multiple/shared methods), or that the factory method would do something fancier...?