Синглтоны действительно имеют свое применение. Я бы суммировал их полезность как:
«Синглтон должен использоваться для представления на объекте которого, в соответствии с фундаментальным дизайном или требованиями, может быть не более одного экземпляра; и есть данные или ресурсы, связанные с объектом, который несет измеримую стоимость». Вот что я имею в виду.
1) Вы не должны использовать Синглтон в случае, когда есть много чего-то, но нас интересует только одно. Если возможно, что в системе их может быть два, создайте один экземпляр явно.
2) Многие применения Singleton могут быть заменены классом со всеми статическими методами и данными. Если вы можете сделать это без потери производительности, сделайте это.
3) Вы должны рассмотреть Singleton, если есть значительные затраты на настройку объекта: например, если это физический ресурс, который нужно инициализировать, или он опирается на некоторую таблицу поиска, которую нужно инициализировать. Если это так, с помощью Singleton вы можете отложить стоимость инициализации до первого использования объекта, тогда как статический класс обычно инициализируется при запуске приложения. Если объект никогда не используется, вы никогда не оплачиваете стоимость инициализации.