I studied this moment and came across this question, but did not feel that it was fully answered. Nevertheless, I found this convenient article - Updating design rules: factories and designers - Krzysztof Kvalina (chief architect on the .NET Framework), It is worth reading the whole article, but here is a brief overview of the main points:
The most common and consistent way to create an instance of a type is through its constructor. However, sometimes the preferred alternative is to use the Factory pattern.
Prefer designers over factories, because they are usually more consistent and convenient than specialized construction mechanisms.
Perform Factory operations as methods, not properties.
Return instances as method return values, not as out parameters.
Consider using Factory if you need more control over instance creation.
Consider the names of Factory methods by combining "Create" and the name of the type being created.
Consider Factory type names by concatenating the type name, which is and
Do not use your Factory using the static method if the construction operation should be available for specialized subclasses.
Use Factory for conversion style operations.
Use Factory if the operation requires parameter information that seems unnatural to pass to the constructor.
Do not use Factory in situations where the create operation is used as the main script to create an instance of the type. In these situations, openness and coherence are paramount.
Consider using a constructor instead of Factory. Only after that you should start implementation of Factory.
Plants can also often be useful for incorporating type specialization through polymorphism.
Use Factory if API users will encode a base class or interface whose implementation may change over time.
Use Factory methods in cases where the developer may not know what type to build, for example, when encoding with a base type or interface.
Use Factory operations as virtual instance methods than static methods if they must support polymorphic expansion.
Use the Singleton pattern for instance-based factories since this does not force developers to create an instance of type Factory only to call one of its members.
Use the Factory method if the constructor is insufficient to describe the operation being performed and additional information received from the individually named Factory, the operation is clearer.