सॉफ्टवेयर में Singleton पैटर्न ऐसा साधन है जो एक क्लास का केवल एक ही इंस्टेंस बनाने और उसे एक ज्ञात वैश्विक एक्सेस पॉइंट से उपलब्ध कराने की गारंटी देता है। यह केंद्रीय कॉन्फ़िगरेशन या साझा लॉगर जैसी सेवाओं के लिए उपयोगी है, पर गलत उपयोग से टेस्टिंग और मेंटेनेबिलिटी बिगड़ सकती है।1
January 19, 2026 (5mo ago) — last updated May 16, 2026 (1mo ago)
TypeScript Singleton: डेवलपर गाइड
Singleton पैटर्न कब उपयोग करें, TypeScript में लागू करने का तरीका, टेस्टिंग व रिफैक्टरिंग सुझाव और DI विकल्प।
← Back to blog
TypeScript में Singleton पैटर्न में महारत: एक संपूर्ण गाइड

सॉफ्टवेयर विकास में कुछ पैटर्न बहुत उपयोगी होते हैं पर उन्हें सावधानी से अपनाना चाहिए। Singleton पैटर्न उन्हीं में से एक है: यह सुनिश्चित करता है कि किसी क्लास का केवल एक ही इंस्टेंस हो और उसे एक ज्ञात, वैश्विक एक्सेस पॉइंट के माध्यम से उपलब्ध कराया जाए1। यह केंद्रीय कॉन्फ़िगरेशन मैनेजर या साझा लॉगर जैसी सेवाओं के लिए उपयुक्त है, पर इसका दुरुपयोग टेस्टेबिलिटी और मेंटेनेबिलिटी को नुकसान पहुँचा सकता है।
Singleton पैटर्न क्या है और कब उपयोगी है?
एक मध्यकालीन राज्य में केवल एक आधिकारिक शाही लेखक की कल्पना करें: वही हर दस्तावेज़ का एकल, आधिकारिक रिकॉर्ड रखता है। प्रोग्रामिंग में Singleton इसी सिद्धांत को लागू करता है — एक क्लास को केवल एक इंस्टेंस तक सीमित करना ताकि वह किसी विशेष संसाधन का "सिंगल सोर्स ऑफ ट्रुथ" बने।
मुख्य उपयोग के मामले:
- लॉगिंग सेवाएँ: सभी इवेंट्स एक ही स्ट्रीम में जाएँ।
- कॉन्फ़िगरेशन मैनेजर: एप्लिकेशन सेटिंग्स का एकल स्रोत।
- हार्डवेयर इंटरफ़ेस: डिवाइस पर विरोधाभासी कमांड्स से बचाव।
मूल विचार सरल पर शक्तिशाली है: एक क्लास, एक इंस्टेंस, एक सार्वभौमिक एक्सेस पॉइंट।
संक्षेप में — पैटर्न की खाका
| विशेषता | विवरण |
|---|---|
| Single instance | निजी कंस्ट्रक्टर और स्टैटिक सेक्शन के साथ केवल एक इंस्टेंस बनता है। |
| Global access point | getInstance() जैसा स्टैटिक मेथड किसी भी जगह से इंस्टेंस एक्सेस करवाता है। |
| Lazy initialization | ज़रूरत पड़ने पर ही इंस्टेंस बनाए जाने से स्टार्टअप पर लोड कम होता है। |
| State management | साझा ग्लोबल स्टेट जैसे एप सेटिंग्स या सेशन के लिए केंद्रीकृत स्थान। |
Singletons के लाभ और जोखिम
Singletons कई परिदृश्यों में सरल समाधान देते हैं, पर वे ग्लोबल स्टेट और छिपी हुई कपलिंग भी लाते हैं जो परीक्षण और समवर्तीता में समस्याएँ पैदा कर सकती हैं।
लाभ:
- ग्लोबल एक्सेस पॉइंट से उपयोग सरल होता है।
- लेज़ी इनिशियलाइज़ेशन स्टार्टअप लागत बचा सकता है।
- महंगे संसाधनों के डुप्लीकेशन को रोकता है।
जोखिम:
- टाइट कपलिंग और छिपी निर्भरताएँ।
- ग्लोबल म्यूटेबल स्टेट द्वारा जटिल बग।
- यूनिट टेस्टिंग में कठिनाई और मॉक करने की समस्या3।
समय-आधारित बग और रेस कंडीशंस खासकर तब बढ़ते हैं जब Singleton में म्यूटेबल स्टेट हो और समन्वयन न हो।
TypeScript में Singleton कैसे बनाएं
आधुनिक TypeScript में सिंपल, टाइप-सेफ Singleton के लिए नुस्खा: private कंस्ट्रक्टर + static एक्सेस मेथड। नीचे एक व्यावहारिक ConfigManager उदाहरण दिया गया है।
class ConfigManager {
private static instance: ConfigManager;
private settings: Map<string, any> = new Map();
private constructor() {
// वास्तविक ऐप में यह फाइल, env या रिमोट सर्विस से लोड कर सकता है
console.log("Initializing ConfigManager instance...");
this.settings.set("API_URL", "https://api.example.com");
this.settings.set("TIMEOUT", 5000);
}
public static getInstance(): ConfigManager {
if (!ConfigManager.instance) {
ConfigManager.instance = new ConfigManager();
}
return ConfigManager.instance;
}
public get(key: string): any {
return this.settings.get(key);
}
}
उपयोग:
class ApiService {
private apiUrl: string;
constructor() {
const config = ConfigManager.getInstance();
this.apiUrl = config.get("API_URL");
console.log(`ApiService initialized with API URL: ${this.apiUrl}`);
}
public fetchData(): void {
console.log(`Fetching data from ${this.apiUrl}...`);
}
}
console.log("Application starting...");
const service1 = new ApiService();
service1.fetchData();
const service2 = new ApiService();
console.log("Application finished.");
यदि सब कुछ सही है, ConfigManager केवल एक बार इनिशियलाइज़ होगा, दोनों सर्विसेस वही इंस्टेंस साझा करेंगी।
परीक्षण, रिफैक्टरिंग और आधुनिक विकल्प
Singletons यूनिट टेस्टिंग को जटिल बना देते हैं क्योंकि वे ग्लोबल, स्थायी स्टेट पेश करते हैं। इसलिए आधुनिक प्रैक्टिस में डिपेंडेंसी इंजेक्शन (DI) को प्राथमिकता दी जाती है: DI निर्भरताओं को स्पष्ट बनाता है और टेस्ट डबल्स पास करना आसान बनाता है45।
DI बनाम Singleton
एक अच्छा पैटर्न है कि कंज्यूमर को इंटरफ़ेस के माध्यम से निर्भरता दी जाए:
interface IConfigManager { get(key: string): any; }
class ApiService {
constructor(private config: IConfigManager) {
this.apiUrl = config.get("API_URL");
}
}
इस तरह ApiService केवल IConfigManager पर निर्भर रहता है और टेस्ट के दौरान आप आसानी से मॉक पास कर सकते हैं। कई फ्रेमवर्क यह पैटर्न बिल्ट-इन देते हैं, जैसे NestJS और Angular46।
लेगेसी कोडबेस से क्रमिक रिफैक्टरिंग
MySingleton.getInstance()के कॉल्स की पहचान करें और इंटरफ़ेस बनायें।- एक-एक कंज्यूमर को कंस्ट्रक्टर इंजेक्शन के लिए बदलें।
- कंपोज़िशन रूट पर सिंगल इंस्टेंस या DI कंटेनर से इंस्टेंस पास करें।
यह तरीका जोखिम कम करता है और बड़े सिस्टम में रिग्रेशन से बचाता है।
सर्वोत्तम प्रैक्टिस
- Singleton केवल उन्हीं सेवाओं के लिए रखें जो वास्तविक रूप से अनन्य हों।
- टेस्टेबिलिटी बढ़ाने के लिए इंटरफेस और DI का उपयोग करें।
- यदि Singleton का उपयोग अनिवार्य है, तो लेज़ी इनिशियलाइज़ेशन और समवर्तीता सुरक्षा लागू करें।
- रिफैक्टरिंग के दौरान छोटे, सुरक्षित चरणों में बदलें।
तेज़ Q&A — सामान्य प्रश्नों के संक्षिप्त उत्तर
Q: Singleton कब उपयुक्त है? A: जब कोई संसाधन वास्तविक रूप से अनन्य हो, जैसे एक केंद्रीकृत लॉगर या हार्डवेयर एडाप्टर; अधिकांश मामलों में DI बेहतर विकल्प है।
Q: Singleton यूनिट टेस्टिंग को कैसे प्रभावित करता है? A: यह ग्लोबल स्टेट और साइड इफेक्ट्स लाता है, जिससे टेस्ट्स के बीच स्टेट लीक और मॉकिंग कठिन होती है; इंटरफ़ेस और DI से यह सरल हो जाता है।
Q: लेगेसी कोड में Singleton से कैसे छुटकारा पाऊँ? A: उपयोगों का नक्शा बनायें, इंटरफ़ेस परिभाषित करें, कंज्यूमर को क्रमिक रूप से कंस्ट्रक्टर इंजेक्ट करने के लिए रिफैक्टर करें, फिर कंपोज़िशन रूट से इंस्टेंस पास करें।
अगले कदम
अपनी टीम के साथ चर्चा शुरू करें कि कहाँ एकल साझा इंस्टेंस वास्तव में आवश्यक है। एक छोटे मॉड्यूल में DI का प्रोटोटाइप बनायें, कोडिंग मानक अपनाएँ, और पेयर प्रोग्रामिंग के माध्यम से रिफैक्टर्स को सुरक्षित रखें।
याद रखें, कोई भी पैटर्न जादू की गोली नहीं है। Singleton की अपनी जगह है, पर उसे साफ़ इंटरफेस और स्पष्ट ओनरशिप नियमों के साथ विवेकपूर्ण तरीके से उपयोग करना चाहिए।
AI कोड लिखता है।आप इसे टिकाऊ बनाते हैं।
AI त्वरण के युग में, क्लीन कोड केवल एक अच्छी प्रथा नहीं है — यह उन प्रणालियों के बीच का अंतर है जो स्केल होती हैं और कोडबेस जो अपने वजन के तहत ढह जाते हैं।