#pragma once template class Singleton { public: static T* Create(const GameContext& gameContext) { if(!m_IsInitialized) { m_pInstance = new T(); m_pInstance->m_GameContext = gameContext; m_pInstance->Initialize(); m_IsInitialized = true; } return m_pInstance; } static T* Get() { if (!m_IsInitialized) { Logger::LogWarning(L"Singleton not yet initialized"); return nullptr; } if(!m_pInstance) { Logger::LogWarning(L"Singleton is initialized but instance in NULL"); } return m_pInstance; } static void Destroy() { delete m_pInstance; m_pInstance = nullptr; } protected: virtual void Initialize() = 0; static bool m_IsInitialized; GameContext m_GameContext{}; private: static T* m_pInstance; }; template T* Singleton::m_pInstance{}; template bool Singleton::m_IsInitialized{};