स्ट्रक्चरल डिज़ाइन पैटर्न्स: फ़ासाड, फ्लाईवेट, और प्रॉक्सी
स्ट्रक्चरल डिज़ाइन पैटर्न्स आपको क्लासेस और ऑब्जेक्ट्स को व्यवस्थित करने में मदद करते हैं।
आज हम आपके टूलकिट को पूरा करने के लिए अंतिम तीन पैटर्न्स को कवर करेंगे।
1. फ़ासाड पैटर्न (The Facade Pattern) फ़ासाड जटिल सिस्टम को सरल बनाता है। यह जटिल क्लासेस के समूह के लिए एक सरल इंटरफ़ेस प्रदान करता है।
एक मूवी थिएटर के बारे में सोचें। फिल्म देखने के लिए, आपको लाइटें धीमी करनी पड़ती हैं, प्रोजेक्टर शुरू करना पड़ता है, और पर्दे खोलने पड़ते हैं। पांच अलग-अलग सिस्टम को कॉल करने के बजाय, आप केवल एक मेथड कॉल करते हैं: theater.watch_movie()।
इसका उपयोग तब करें जब:
- आप एक जटिल सबसिस्टम को सरल बनाना चाहते हैं।
- आपको एक बड़े API के लिए एक सिंगल एंट्री पॉइंट की आवश्यकता हो।
- आप क्लाइंट्स को आंतरिक लॉजिक (internal logic) से अलग करना चाहते हैं।
2. फ्लाईवेट पैटर्न (The Flyweight Pattern) फ्लाईवेट मेमोरी बचाता है। यह तब काम आता है जब आपके पास हजारों समान ऑब्जेक्ट्स हों।
हर ऑब्जेक्ट में हर विवरण को स्टोर करने के बजाय, आप डेटा को विभाजित करते हैं। आप साझा, अपरिवर्तनीय डेटा (intrinsic state) को एक स्थान पर रखते हैं। आप अद्वितीय डेटा (extrinsic state) को अलग रखते हैं।
इसका उपयोग तब करें जब:
- मेमोरी का उपयोग एक वास्तविक समस्या हो।
- आप लाखों समान ऑब्जेक्ट्स को मैनेज करते हैं, जैसे टेक्स्ट एडिटर में कैरेक्टर या गेम में पार्टिकल्स।
- आप परफॉरमेंस सुधारने के लिए ऑब्जेक्ट पूलिंग का उपयोग करना चाहते हैं।
3. प्रॉक्सी पैटर्न (The Proxy Pattern) प्रॉक्सी किसी अन्य ऑब्जेक्ट के विकल्प (stand-in) के रूप में कार्य करता है। यह एक्सेस को नियंत्रित करने के लिए क्लाइंट और वास्तविक ऑब्जेक्ट के बीच स्थित होता है।
एक प्रॉक्सी कर सकता है:
- लेजी लोड (Lazy load): भारी इमेज को केवल तभी लोड करें जब यूजर उन पर क्लिक करे।
- एक्सेस कंट्रोल: जांचें कि क्या यूजर के पास डेटाबेस डिलीट करने की अनुमति है।
- एक्टिविटी लॉग करना: ट्रैक करें कि कौन सी विशिष्ट सेवा का उपयोग कौन कर रहा है।
- परिणाम कैश (Cache) करना: महंगे लॉजिक को चलाने के बजाय सेव किया गया डेटा वापस करें।
इसका उपयोग तब करें जब:
- आपको महंगे ऑपरेशन्स में देरी करने की आवश्यकता हो।
- आपको किसी संवेदनशील सेवा की सुरक्षा करनी हो।
- आप मूल क्लास को बदले बिना लॉगिंग या सुरक्षा जोड़ना चाहते हैं।
सारांश तालिका
• एडेप्टर (Adapter): असंगत सिस्टम को एक साथ काम करने में सक्षम बनाता है। • ब्रिज (Bridge): एब्स्ट्रैक्शन को इम्प्लीमेंटेशन से अलग करता है। • कंपोजिट (Composite): ट्री स्ट्रक्चर बनाता है। • डेकोरेटर (Decorator): क्लासेस को संशोधित किए बिना व्यवहार जोड़ता है। • फ़ासाड (Facade): जटिल सबसिस्टम को सरल बनाता है। • फ्लाईवेट (Flyweight): मेमोरी बचाने के लिए डेटा साझा करता है। • प्रॉक्सी (Proxy): ऑब्जेक्ट्स के एक्सेस को नियंत्रित करता है।
गोल्डन रूल: कोड को मेंटेनेबल (maintainable) बनाने के लिए इन पैटर्न्स का उपयोग करें। इन्हें केवल दिखावे के लिए उपयोग न करें।
इसके बाद, हम बिहेवियरल डिज़ाइन पैटर्न्स (Behavioral Design Patterns) सीरीज़ शुरू करेंगे।
Mahdi Shamlou: Structural Design Patterns 2026 - Facade, Flyweight, Proxy (Production Examples)
Structural design patterns इस बारे में हैं कि हम बड़ी संरचनाएं बनाने के लिए क्लासेस और ऑब्जेक्ट्स को कैसे कंपोज़ (compose) करते हैं। वे यह सुनिश्चित करने में मदद करते हैं कि यदि सिस्टम का एक हिस्सा बदलता है, तो पूरे सिस्टम को फिर से बनाने की आवश्यकता नहीं होती है।
इस लेख में, हम तीन आवश्यक structural design patterns के बारे में विस्तार से जानेंगे: Facade, Flyweight, और Proxy, साथ ही उनके वास्तविक दुनिया के प्रोडक्शन उदाहरण (production examples) भी देखेंगे।
1. Facade Pattern
Definition (परिभाषा)
Facade पैटर्न एक जटिल सबसिस्टम (subsystem) के लिए एक सरल इंटरफ़ेस प्रदान करता है। यह सबसिस्टम की जटिलता को छिपा देता है और एक एकल, उपयोग में आसान एंट्री पॉइंट प्रदान करता है।
The Problem (समस्या)
कल्पना कीजिए कि आप एक होम थिएटर सिस्टम बना रहे हैं। मूवी देखने के लिए, आपको ये करना होगा:
- लाइटें चालू करना और उन्हें डिम (dim) करना।
- प्रोजेक्टर चालू करना।
- साउंड सिस्टम चालू करना।
- Blu-ray प्लेयर चालू करना।
- मूवी शुरू करना।
यदि आप हर बार इसे मैन्युअल रूप से करते हैं, तो आपका कोड कई अलग-अलग ऑब्जेक्ट्स को कॉल करने के कारण अव्यवस्थित (cluttered) हो जाएगा।
The Solution (समाधान)
एक Facade क्लास इन सभी जटिल चरणों को एक एकल मेथड, जैसे watchMovie(), में लपेट (wrap) सकती है।
Code Example (TypeScript)
// Complex Subsystem Classes
class Lights {
dim() { console.log("Lights dimmed"); }
}
class Projector {
on() { console.log("Projector on"); }
}
class SoundSystem {
on() { console.log("Sound system on"); }
}
class BluRayPlayer {
play(movie: string) { console.log(`Playing movie: ${movie}`); }
}
// Facade Class
class HomeTheaterFacade {
private lights = new Lights();
private projector = new Projector();
private sound = new SoundSystem();
private player = new BluRayPlayer();
watchMovie(movie: string) {