Какие интересные вещи понаписали. Статические классы в джаве нужны потому что в джаве нет функций. В других языках функции группируются через namespace.
Разница между статическим классом и синглтоном в том что статический класс инициализируется при старте программы, а синглтон только когда идет обращение (кроме того в синглтон можно добавить метод для освобождения памяти от экземпляра).
Например, есть частая функциональность, требующаяся пользователю на протяжении всей работы программы, и можно сделать статический класс. Если пользователю фунциональность редко нужна и может понадобиться в середине или конце программы, то выбираем сингтон.
enum class ProgState {Init, Run, Release};
//вариант 1
bool isLastDoc = (App::state () == ProgState::Init);
App::LoadDocument ( isLastDoc );
//вариант 2
bool isLastDoc = (App::getInstance () -> state () == ProgState::Init);
App::getInstance() -> LoadLastDocument( isLastDoc );
Лично мне синглтоны не нравятся getInstance по всему коду программы, а статик классы тем что надо везде писать слово static при описании класса и в cpp файле иницировать все члены класса. Поэтому я делаю так:
//app.h
App& app (); //здесь можно и статик переменую, а не функцию
//app.cpp
App & app ()
{
static App app;
return app;
}
//в коде
bool isLastDoc = (app() -> state () == ProgState::Init);