It all depends on what do you mean by "object" (in abstarct sense) in you application context, and how do you identify it, and the role that polymorphism must have respect to it.
If your object are not required to be polymorphic, and you can identify them by value, you can pass them by value (or "move" them, in C++11) so -in fact- you can use a "value sematics".
In this context, two variables both containing "abc" are "equal" and considered to represent "the same thing" in different places (scopes).
If you identify objects by their position in memory (a.k.a. address) than you have to pass pointers or references, so that no copy is made. In this context two different variables both containing "abc" are considered "representing different things, that incidentally looks the same".
If polymorphism is required, then, pass by pointer (or by reference, but not by value) is a must, since C++ polymorphism is operated by means of indirection.
OOP based programs tend to follow the second paradigm.
Functional or generic programs tend to follow the first.
The main point, here, is that the "factory pattern" is an OOP technique, not that interesting outside the OOP world.