Some things should exist only once in a program, like a config object, a logger or a connection pool. Singleton makes sure only one instance is created and gives one way to reach it. Use it when two copies would waste resources or disagree with each other, and be ready to write the thread-safe version since "why volatile?" is a favourite question. It is global state that makes testing harder, so often creating one instance and injecting it is the better choice.