Singleton Pattern
Singleton pattern क्या है
Singleton pattern पक्का करता है कि class का पूरे program को सिर्फ़ एक object हो, और उस तक पहुँचने का एक साफ़ तरीका देता है। यह classic design pattern तब इस्तेमाल होता है जब ठीक एक साझा instance अर्थपूर्ण हो — जैसे एक database connection या settings manager।
इसे क्यों इस्तेमाल करें
- एक साझा resource — एक database connection, cache या logger।
- संगत state — सब वही object इस्तेमाल करते हैं, तो data sync रहता है।
- नियंत्रित access — creation एक जगह होती है जिसे आप control करते हैं।
यह किसी भी स्थिति को fit होता है जहाँ कई objects बनाना बेकार या गलत होगा।
Java program
class Database {
private static Database instance; // single object
private Database() { // private constructor
System.out.println("Database created");
}
public static Database getInstance() {
if (instance == null) { // सिर्फ़ एक बार बनाओ
instance = new Database();
}
return instance; // हमेशा वही object
}
}
public class Main {
public static void main(String[] args) {
Database db1 = Database.getInstance();
Database db2 = Database.getInstance();
System.out.println(db1 == db2); // वही object?
}
}
true
ध्यान दीजिए "Database created" सिर्फ़ एक बार print होता है, और db1 == db2 true है — दोनों variables बिल्कुल वही object की ओर इशारा करते हैं।
Dry run
| Step | Call | instance == null? | Kya hua |
|---|---|---|---|
| 1 | getInstance() (db1) | haan (pehli baar) | naya Database banaya, instance me store |
| 2 | getInstance() (db2) | nahi (pehle se hai) | wahi purana instance return |
| db1 aur db2 ek hi object hain → db1 == db2 is true | |||
पहली getInstance() पाती है instance null है, तो object बनाती है। हर बाद वाली call पाती है वो पहले से है और वही return करती है — तो कभी सिर्फ़ एक object रहता है।
तीन मुख्य हिस्से
- Private static field — single instance रखता है।
- Private constructor — दूसरों को
newइस्तेमाल से रोकता है। - Public static getInstance() — एक बार बनाता है, हमेशा return करता है।
साथ में ये तीन ठीक एक object की गारंटी देते हैं, हर जगह एक ही तरीके से पहुँचा।
Thread safety नोट
ऊपर वाला सरल version thread-safe नहीं है: दो threads एक साथ getInstance() call करते हुए दोनों instance == null देख सकते हैं और दो objects बना सकते हैं। Multithreaded code को, getInstance() को synchronized बनाइए, eager instance इस्तेमाल कीजिए, या enum singleton इस्तेमाल कीजिए।
आम गलतियाँ
- Public constructor। इसे private बनाइए, वरना दूसरे और objects बना सकते हैं।
- Null जाँच भूलना। इसके बिना, हर call नया object बनता है।
- Thread safety अनदेखा करना। Multithreaded इस्तेमाल को synchronization जोड़िए।
- Singletons का ज़्यादा इस्तेमाल। बहुत global state code test करना मुश्किल बनाता है।
सारांश
- Singleton pattern class का सिर्फ़ एक object allow करता है।
- Private constructor, static instance, और getInstance() इस्तेमाल कीजिए।
- getInstance() object एक बार बनाकर हर बार return करता है।
- यह connection या configuration जैसे साझा resources को fit होता है।
- बुनियादी version को thread-safe होने को अतिरिक्त सावधानी चाहिए।
आगे, objects दोहराइए classes और objects में, या static keyword जिस पर यह निर्भर है।
