जावास्क्रिप्ट में डिज़ाइन पैटर्न कोड उदाहरणों के साथ
डिज़ाइन पैटर्न (design patterns) सॉफ्टवेयर विकास में सामान्य समस्याओं के सिद्ध समाधान हैं। जावास्क्रिप्ट डेवलपर के लिए पैटर्न का ज्ञान विशेष रूप से महत्वपूर्ण है, क्योंकि भाषा में लचीला ऑब्जेक्ट मॉडल है और इसका व्यापक रूप से क्लाइंट और सर्वर (Node.js) दोनों पर उपयोग किया जाता है। इस लेख में हम जावास्क्रिप्ट पर व्यावहारिक उदाहरणों के साथ चार प्रमुख पैटर्न का विश्लेषण करेंगे।
डिज़ाइन पैटर्न क्यों सीखें?
पैटर्न मदद करते हैं:
- कोड के रखरखाव और स्केलिंग को सरल बनाना
- कोड को अधिक पठनीय और पूर्वानुमानित बनाना
- "पहिया का पुनः आविष्कार" करने से बचना
- टीम में संचार में सुधार (सामान्य भाषा)
1. Singleton (एकल)
Singleton पैटर्न सुनिश्चित करता है कि एक वर्ग का केवल एक उदाहरण है, और उस तक वैश्विक पहुंच प्रदान करता है। Node.js में इस पैटर्न का उपयोग अक्सर डेटाबेस कनेक्शन, कॉन्फ़िगरेशन या लॉगिंग के लिए किया जाता है।
class DatabaseConnection { constructor() { if (DatabaseConnection.instance) { return DatabaseConnection.instance; } this.connection = null; DatabaseConnection.instance = this; }
connect() { // डेटाबेस कनेक्शन का अनुकरण this.connection = "connected"; console.log("डेटाबेस से कनेक्शन स्थापित"); }
query(sql) { if (!this.connection) { throw new Error("डेटाबेस से कोई कनेक्शन नहीं"); } console.log(`क्वेरी निष्पादित कर रहे हैं: ${sql}`); return { data: [] }; }}
// उपयोगconst db1 = new DatabaseConnection();const db2 = new DatabaseConnection();
db1.connect();console.log(db1 === db2); // true - दोनों एक ही उदाहरण को इंगित करते हैंdb2.query("SELECT * FROM users");कब उपयोग करें: साझा संसाधनों का प्रबंधन (डेटाबेस, कॉन्फ़िगरेशन, कैश)। सावधानी: अत्यधिक उपयोग से कोड में मजबूत युग्मन हो सकता है।
2. Factory (फैक्टरी)
Factory Method ऑब्जेक्ट बनाने के लिए एक इंटरफ़ेस परिभाषित करता है, लेकिन उपवर्गों को बनाए जाने वाले ऑब्जेक्ट के प्रकार को बदलने की अनुमति देता है। जावास्क्रिप्ट में इसे अक्सर सामान्य फ़ंक्शन या क्लास के माध्यम से कार्यान्वित किया जाता है।
class User { constructor(name, role) { this.name = name; this.role = role; }
getPermissions() { return []; }}
class Admin extends User { getPermissions() { return ["read", "write", "delete", "manage"]; }}
class Editor extends User { getPermissions() { return ["read", "write"]; }}
class Viewer extends User { getPermissions() { return ["read"]; }}
// फैक्टरीclass UserFactory { createUser(name, role) { switch (role) { case "admin": return new Admin(name, role); case "editor": return new Editor(name, role); case "viewer": return new Viewer(name, role); default: throw new Error("अज्ञात भूमिका"); } }}
// उपयोगconst factory = new UserFactory();const admin = factory.createUser("अन्ना", "admin");const viewer = factory.createUser("इवान", "viewer");
console.log(admin.getPermissions()); // ["read", "write", "delete", "manage"]console.log(viewer.getPermissions()); // ["read"]लाभ: ऑब्जेक्ट निर्माण का केंद्रीकृत प्रबंधन, नए प्रकार जोड़ने में आसानी, इंस्टेंटिएशन लॉजिक को छिपाना।
3. Observer (प्रेक्षक)
Observer पैटर्न ऑब्जेक्ट के बीच "एक-से-अनेक" निर्भरता को परिभाषित करता है। जब कोई ऑब्जेक्ट (विषय) अपनी स्थिति बदलता है, तो सभी आश्रित ऑब्जेक्ट (प्रेक्षक) स्वचालित रूप से सूचित हो जाते हैं। यह Node.js में इवेंट-संचालित प्रोग्रामिंग का आधार है।
class EventEmitter { constructor() { this.events = {}; }
on(eventName, listener) { if (!this.events[eventName]) { this.events[eventName] = []; } this.events[even