Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype.
Ensure a class has only one instance and provide a global point of access to it.
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
This pattern is used to create concrete class instances without specifying the exact class type.