Emphasis on flexibility and reuse through decoupling of classes.
Deal with initializing and configuring classes and objects.
Define an interface for creating an object, but let subclasses decide which class to instantiate.
Factory method lets a class defer instantiation to subclasses.
Provide an interface for creating families of related or dependent objects without specifying their concrete class.
Separate the construction of a complex object from its representation so that the same construction process can
create different representations.
Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.
Ensure a class only has one instance, and provide a global point of access to it.