I hate software design patterns. Not because I am ignorant of them – to be clear, I am not – but because they discourage creative programming.
Programming is an art and, as such, is inspired instead of being systematic. Whenever a developer applies a design pattern as a first resort, he misses the opportunity of finding a better way to achieve his goal and may even be doing something with negative repercussions.
The use of the Singleton Pattern demonstrates this. At the surface, the pattern seems appropriate for solving the problem of how to restrict a class to only one instance; however, because a singleton behaves like a global, it is inevitable that it will be used as such, which causes issues such as instance coupling that inhibits unit-testing or lack of thread-safety.
That is not to say that all patterns are bad, but presented as “solutions for known problems”, they discourage problem-solving and cause issues that outweigh the benefits they are supposed to bring.