What’s a Singleton?
A Singleton pattern creates a single, shared instance of a class and gives you a way to access it globally—without actually using global variables.
Use it when:
- You need shared access to something like config or logging
- You only want to initialize that thing once
- You want predictable behavior across your app
Why It Makes Sense for Config
Your app config doesn’t need to be read from disk 10 different times. You want to load it once and keep it in memory for easy access.
Using a Singleton for configuration helps you:
- Avoid repetitive file reads
- Ensure consistency across your app
- Keep related logic centralized
Real-World Example (C++ / Qt)
Let’s say you’ve got an app using Qt, and you want to manage install metadata and app settings stored in JSON. Here’s how you’d do it using a Singleton class named ConfigManager
:
// Singleton instance
ConfigManager& ConfigManager::getInstance() {
static ConfigManager instance;
return instance;
}
The first time getInstance()
is called, it creates the ConfigManager
. Every call after that returns the same object.
📌 This code snippet comes from my public repository on GitHub, which is currently in early development (v0.4). Feel free to check it out and follow along— more features are being added regularly.
What Does the ConfigManager Do?
Here’s a quick breakdown of what this class handles:
- Sets up file paths for user and app config
- Checks if this is the first time the app has run
- Loads (or creates) metadata and settings in JSON
- Provides accessors to get/set config values like backup directory
// Get backup directoryQString ConfigManager::getBackupDirectory() const {
if (!userSettings.contains("backup_config")) return ConfigDefaults::BACKUP_DIRECTORY;
return userSettings["backup_config"].toObject().value("location").toString(ConfigDefaults::BACKUP_DIRECTORY);
}
The full class also uses helpers like JsonManager
to load/save files, QStandardPaths
for directory resolution, and some constants from the app config.
When to Skip the Singleton
A Singleton might not be the best choice if:
- You’re building a multi-tenant app with multiple configs at once
- You need to reset or reload the config mid-run
- You want to inject dependencies for easier unit testing
In those cases, something like dependency injection may be more flexible.
Final Thoughts
Singletons are one of those patterns that are easy to implement and genuinely useful—especially for things like app config. As you witnessed from the snippet of the application I’m currently developing—they keep your code clean, avoiding repetitive file I/O, and makes shared settings easy to access across your entire app.
It’s a straightforward solution to a common problem—and when used intentionally, it can simplify your architecture without adding overhead.