Please make for this code C++ header .h file with class and method prototypes:

#include <iostream>
#include <fstream>
#include <stdexcept>
#include <limits>
#include <string>

using namespace std;

// Паттерн Singleton для логгера
class Logger {
private:
    ofstream logFile;
    static Logger* instance;

    // Приватный конструктор для Singleton
    Logger() {
        logFile.open("log.txt", ios::out | ios::app);
        if (!logFile.is_open()) {
            throw runtime_error("Не удалось открыть файл лога.");
        }
    }

public:
    // Получение экземпляра логгера
    static Logger* getInstance() {
        if (!instance) {
            instance = new Logger;
        }
        return instance;
    }

    // Запись сообщения в лог и вывод в консоль
    void log(const string& message) {
        logFile << message << endl;
        cout << message << endl;
    }

    // Деструктор для закрытия файла
    ~Logger() {
        if (logFile.is_open()) {
            logFile.close();
        }
    }

    // Удаляем возможность копирования и присваивания
    Logger(const Logger&) = delete;
    Logger& operator=(const Logger&) = delete;
};

// Инициализация статической переменной instance
Logger* Logger::instance = nullptr;

// Интерфейс стратегии
class PaymentStrategy {
public:
    virtual void pay(int amount) = 0;
};

// Конкретные стратегии
class CreditCardPayment : public PaymentStrategy {
public:
    void pay(int amount) override {
        string message = "Оплачено " + to_string(amount) + " с использованием кредитной карты.";
        Logger::getInstance()->log(message);
        cout << message << endl;
    }
};

class SberPayPayment : public PaymentStrategy {
public:
    void pay(int amount) override {
        string message = "Оплачено " + to_string(amount) + " с использованием СберПэй.";
        Logger::getInstance()->log(message);
        cout << message << endl;
    }
};

class BankTransferPayment : public PaymentStrategy {
public:
    void pay(int amount) override {
        string message = "Оплачено " + to_string(amount) + " с использованием банковского перевода.";
        Logger::getInstance()->log(message);
        cout << message << endl;
    }
};

// Контекст, использующий стратегию
class ShoppingCart {
private:
    PaymentStrategy* paymentStrategy;

public:
    ShoppingCart(PaymentStrategy* strategy) : paymentStrategy(strategy) {}

    void checkout(int amount) {
        paymentStrategy->pay(amount);
    }
};

// Функция для выбора задачи (1 - оплата, 2 - автомобиль)
int chooseTask() {
    int task;
    cout << "Выберите задачу:" << endl;
    cout << "1. Оплата" << endl;
    cout << "2. Работа с автомобилем" << endl;
    cout << "3. Выход" << endl;
    cout << "Ваш выбор: ";
    cin >> task;
    return task;
}

// Функция для выбора способа оплаты
PaymentStrategy* choosePaymentMethod() {
    int choice;
    cout << "Выберите способ оплаты:" << endl;
    cout << "1. Кредитная карта" << endl;
    cout << "2. СберПэй" << endl;
    cout << "3. Банковский перевод" << endl;
    cout << "Ваш выбор: ";
    cin >> choice;

    switch (choice) {
        case 1:
            return new CreditCardPayment();
        case 2:
            return new SberPayPayment();
        case 3:
            return new BankTransferPayment();
        default:
            cout << "Неправильный выбор. Используется кредитная карта по умолчанию." << endl;
            return new CreditCardPayment();
    }
}

// Подсистема для работы с двигателем
class Engine {
public:
    void start() {
        cout << "Двигатель запущен" << endl;
    }

    void stop() {
        cout << "Двигатель заглушен" << endl;
    }
};

// Подсистема для работы с топливной системой
class FuelSystem {
public:
    void pumpFuel() {
        cout << "Топливо подано в двигатель" << endl;
    }

    void stopPumpingFuel() {
        cout << "Топливо не подаётся" << endl;
    }
};

// Подсистема для работы с электрической системой
class ElectricalSystem {
public:
    void powerOn() {
        cout << "Питание включено" << endl;
    }

    void powerOff() {
        cout << "Питание выключено" << endl;
    }
};

// Фасад, предоставляющий унифицированный интерфейс для работы с подсистемами
class CarFacade {
private:
    Engine engine;
    FuelSystem fuelSystem;
    ElectricalSystem electricalSystem;

public:
    void startCar() {
        cout << "Запуск автомобиля" << endl;
        electricalSystem.powerOn();
        fuelSystem.pumpFuel();
        engine.start();
    }

    void stopCar() {
        cout << "Автомобиль заглушен" << endl;
        engine.stop();
        fuelSystem.stopPumpingFuel();
        electricalSystem.powerOff();
    }
};

int main() {
    int task;
    while (true) {
        task = chooseTask();

        switch (task) {
            case 1: {
                int amount;
                cout << "Введите сумму для оплаты: ";
                cin >> amount;

                PaymentStrategy* chosenPaymentMethod = choosePaymentMethod();
                ShoppingCart shoppingCart(chosenPaymentMethod);
                shoppingCart.checkout(amount);
                delete chosenPaymentMethod;
                break;
            }
            case 2: {
                CarFacade carFacade;

                int choice;
                do {
                    cout << "Выберите действие:" << endl;
                    cout << "1 - Запустить автомобиль" << endl;
                    cout << "2 - Заглушить автомобиль" << endl;
                    cout << "3 - Выход" << endl;
                    cin >> choice;

                    switch (choice) {
                        case 1:
                            carFacade.startCar();
                            break;
                        case 2:
                            carFacade.stopCar();
                            break;
                        case 3:
                            cout << "Выход из программы." << endl;
                            break;
                        default:
                            cout << "Неверный выбор. Попробуйте снова." << endl;
                    }
                } while (choice != 3);
                break;
            }
            case 3:
                cout << "Выход из программы." << endl;
                return 0;
            default:
                cout << "Неверный выбор задачи. Попробуйте снова." << endl;
        }
    }

    return 0;
}