I’m creating a game with C++ and SFML, and i am writing an Input Manager to do stuff like hold a container with callback functions and load Bindings from a file. Is it a good idea to define the Input Manager as a Singleton or a Monostate class?
I am aware that the Singleton and the Monostate pattens have lots of problems like thread safety and difficult testing but it this case where the Input Manager would need to be shared across the program would it make sense and if not is there a better solution?
You can use the Singleton or Monostate pattern for an Input Manager to centralize access. But, it's important to consider the potential drawbacks and alternatives.
It ensures a single instance throughout the application and it provides global access to the instance but it is harder to test due to global state, can introduce hidden dependencies and is not inherently thread-safe. On the other hand,Monostate Provides the appearance of multiple instances while sharing state and Easier to mock for testing compared to Singleton. But still shares global state, which can complicate debugging and is Less intuitive than a straightforward Singleton.
You can consider using Dependency Injection (DI). it allows you to pass the Input Manager instance where needed, providing flexibility as well as improving testability. It Improved testability by allowing easy swapping of implementations. Clear dependencies, make the code easier to understand and maintain, and most important thing it is flexible and adaptable to changes in the future. But it requires a bit more boilerplate code and you should avoid it for small projects. You can find a very useful resource to learn more about it here.