Ответ 1
"1) Должен ли я запускать класс интерфейса или реализации из остальной части моей программы всякий раз, когда мне нужно использовать класс? Как именно это сделать?"
Используйте интерфейс, который будет меньше загромождать ваш код вызовами Implementation::Instance()
:
Interface& module = Implementation::Instance();
// ^
Обратите внимание, что ссылка, назначение и копия не будут работать.
"2) Как должен выглядеть метод Instance()?
Общий консенсус заключается в использовании подхода Скотта Мейера:
Implementation& Instance() {
static Implementation theInstance;
return theInstance;
}
Лучшей альтернативой является не использовать синглтон вообще, а сделать код готовым к работе только с Interface
:
class Interface {
// ...
};
class Impl : public Interface {
// ...
};
class Client {
Interface& if_;
public:
Client(Interface& if__) : if_(if__) {}
// ...
}
int main() {
Impl impl;
Client client(impl);
};