When should we use the Singleton pattern and why?
In theory: when you need to restrict the instantiation of an object to one instance. In practice: never.
If you have a situation when exactly one object is needed to coordinate actions across the system, then you can use this pattern. A good example of this is the Facade, that is, Facades can be implemented as singletons because often one Facade object is needed across the system.
But in general, it's usually a bad practice and should be avoided, one big reason is it greatly inhibits extensibility.
When you want a bunch of different objects to be able to make reference to one single object. Maybe they want to all use the same PhysicsEngineDude or something... You don't want different objects having different physics models when they live in the same world!