Ensure a class only has a single instance, and provide a global point of access to it.
Specify the kinds of objects to create using a prototypical instance, and create new objects by copying the implemented prototype.
Simple Factory Pattern
Create an object without exposing the instantiation logic to the client.
Factory Method Pattern
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory method lets a class defer instantiation to subclasses.