The Singleton pattern guarantees a class has exactly one instance across the application by hiding its constructor and exposing a single controlled access point, which is the right approach for a shared resource like a configuration manager.
Key Points: • Make the constructor private so no other class can instantiate the configuration manager directly. • Hold a single static instance field and expose it through a public static getInstance() method. • For thread safety, use double-checked locking, a synchronized method, or the Bill Pugh static inner holder class idiom. • The Bill Pugh approach achieves lazy initialization without synchronization overhead by relying on the JVM's class-loading guarantees. • In Spring applications, beans are singleton-scoped by default within the container, which can replace a hand-rolled Singleton in many cases.
Example: A ConfigurationManager class with a private constructor and a static getInstance() method ensures every part of the application reads from the exact same loaded configuration object, avoiding conflicting in-memory copies.
Code Example:
public class ConfigurationManager {
private ConfigurationManager() {}
private static class Holder {
static final ConfigurationManager INSTANCE = new ConfigurationManager();
}
public static ConfigurationManager getInstance() {
return Holder.INSTANCE;
}
}Interview Tip: A concise interview answer is:
"I'd implement the Singleton with a private constructor and a static getInstance() accessor, using the Bill Pugh static inner holder class for lazy, thread-safe initialization without synchronization overhead. In a Spring context, I could also just rely on the container's default singleton bean scope instead of hand-rolling it."