सिंपल फैक्ट्री डिजाइन पैटर्न एक बहुत ही उपयोगी और प्रचलित डिजाइन पैटर्न है। सिंपल फैक्ट्री डिजाइन पैटर्न के अतिरिक्त और भी कई तरह के मिलते जुलते डिजाइन पैटर्न है जैसे फैक्ट्री मेथड पैटर्न, एब्स्ट्रेक्ट फैक्ट्री पैटर्न इत्यादि।
इस लेख में हम सिंपल फैक्ट्री डिजाइन पैटर्न के बारे में अध्ययन करेंगे।
सबसे पहले हमें यह समझना है की डिजाइन पैटर्न क्यों यूज़ किया जाता है। डिजाइन पैटर्न यूज करने के पीछे सबसे बड़ा कारण यह है कि इसके कारण एप्लिकेशन की एफिशिएंसी बढ़ जाती है। इस पैटर्न के यूज करने पर एप्लिकेशन में रेक्विरेमेंट चेंज होने पर एप्लिकेशन के अलग अलग कोड में ज्यादा परिवर्तन नहीं करना पड़ता है।
जब हम क्लाइंट क्लास के भीतर किसी क्लास के ऑब्जेक्ट को क्रिएट करते हैं तब अगर भविष्य में उस क्लास के ऑब्जेक्ट के बजाय किसी अन्य क्लास के ऑब्जेक्ट को क्रिएट करना हो तो हमें कोड में जगह-जगह जाकर उस क्लास के कोड को परिवर्तित करना होगा जो कि एक बहुत ही मुश्किल कार्य होगा। इसी तरह अगर हमें क्रिएट किए हुए क्लास के कॉन्स्ट्रक्टर में पैरामीटर की संख्या को बढ़ाना घटाना इत्यादि हो तो भी हमें कोड में जगह-जगह जाकर उस क्रिएट ऑब्जेक्ट के कोड को परिवर्तित करना होगा जो कि एक दुःसाध्य कार्य होगा।
इन सब समस्याओं पर विचार करके यह देखा गया कि क्लाइंट क्लास के भीतर जब किसी ऑब्जेक्ट को क्रिएट करना हो जहां पर वह ऑब्जेक्ट किसी भी मिलते जुलते क्लास का हो सकता है तो ऐसी स्थिति में new ऑपरेटर के द्वारा ऑब्जेक्ट को क्रिएट करने की बजाए हम एक फैक्ट्री class का उपयोग करते हैं जो कि मिलते जुलते क्लास के किसी भी ऑब्जेक्ट को क्रिएट कर सकता है। इस तरीके से हमारा कोड किसी एक पार्टीकूलर क्लास के ऑब्जेक्ट से बाउंड न होकर फैक्ट्री क्लास से बाउंड हो जाता है और फैक्ट्री क्लास में ही ऑब्जेक्ट क्रिएट करने की लॉजिक इंप्लीमेंट होती है।
किस हालत में किस क्लास के ऑब्जेक्टिव क्रिएट करना है फैक्ट्री क्लास के भीतर सटेटिक मेथड में दिया होता है, जिस मेथड के भीतर एक पैरामीटर भी होता है जो यह डिसाइड करता है कि किस क्लास को क्रिएट करना है। फैक्टरी क्लास का मेथड सटेटिक इसलिए दिया जाता है ताकि क्लाइंट क्लास के भीतर किसी क्लास के ऑब्जेक्ट को क्रिएट करते समय फैक्ट्री क्लास का ऑब्जेक्ट क्रिएट न करना पड़े। आमतौर पर किसी भी हेल्पर मेथड को static रखा जाता है। याद रखने वाली बात यह है कि फैक्ट्री क्लास का स्टैटिक मेथड इंटरफ़ेस को रिटर्न करता है। यह इंटरफेस अलग-अलग क्लास के कॉमन मेथड को अपने भीतर समाहित किया होता है।
अब हम सिंपल डिजाइन पैटर्न की बात करेंगे। सिंपल फैक्ट्री डिजाइन पैटर्न में हम एक फैक्ट्री क्लास बनाते हैं और यह फैक्ट्री क्लास अलग-अलग तरह के क्लासेज के ऑब्जेक्ट क्रिएट करने में सक्षम होता है। यह बात समझने वाली है कि जो अलग-अलग तरह के क्लासेज है उनमें क्रियाकलापों अर्थात methods की समानता होती है। इसका अभिप्राय यह है कि जो अलग अलग क्लास है उसमें एक ही तरह के कॉमन मेथड्स होते हैं। यह अलग बात है कि समान नाम के method होने पर भी उनकी इंप्लीमेंटेशन में भिन्नता होती है।
इसका क्या अर्थ निकलता है? इसका अर्थ यह निकलता है कि जो यह अलग-अलग क्लासेज है उनका एक पैरंट क्लास या बेस क्लास पॉसिबल/ संभव है। इस बात को हम दिए हुए समस्या पर विचार करके समझ सकते हैं। मान लीजिए कि आपके पास 5 क्लास है जैसे फिजिक्स टीचर, केमिस्ट्री टीचर, बायोलॉजी टीचर, हिंदी टीचर और अंग्रेजी टीचर। इन पांचों टीचर क्लास में Teach नामक एक कॉमन मेथड है तो हम यह कह सकते हैं कि इन पांचों क्लासेज का एक बेस क्लास संभव है या इंटरफेस सम्भव है जो Teach मेथड को डिक्लेअर करेंगे।
आमतौर पर कॉमन मेथड को इंटरफ़ेस में डिक्लेअर कर देते हैं और प्रत्येक क्लास उस इंटरफेस को इंप्लीमेंट करता है।
यहां तक हमने समझ लिया जो अलग-अलग क्लास हमारे पास है उसमें पहले मेथड डिफाइन था लेकिन अब हम जब उन कौमन मेथड को इंटरफेस में दे देते हैं तो उस इंटरफेस को यह सारे क्लास इम्प्लीमेंट करते हैं।
अब हम सबसे महत्वपूर्ण तथ्य पर बात करेंगे। हम एक फैक्ट्री क्लास बनाएंगे इस फैक्ट्री क्लास का नाम हम समस्या के अनुसार कुछ भी दे सकते हैं लेकिन इस फैक्ट्री क्लास की सबसे बड़ी खासियत यह होगी कि इसमें एक स्टैटिक मेथड होगा जो मेथड हमारे दिए गए इंटरफ़ेस को रिटर्न करेगा और इस मेथड में एक पैरामीटर होगा जिसके द्वारा क्लाइंट मेथड जिस क्लास के ऑब्जेक्ट को बनाना होगा उसके संबंध में मेथड पैरामीटर में इनपुट दे देगा। अब इस इनपुट के आधार पर फैक्ट्री क्लास के मेथड में सारे लॉजिक लिखा जाएगा और उस लॉजिक में यह होगा की new ऑपरेटर की सहायता से जिस क्लास का ऑब्जेक्ट क्रिएट करना है। फैक्ट्री क्लास में उसे क्रिएट करेंगे लेकिन इस क्रिएट हुए ऑब्जेक्ट को हम इंटरफ़ेस के वेरिएबल में assign कर देंगे। क्योंकि फैक्ट्री क्लास का मेथड इंटरफ़ेस को रिटर्न कर रहा है तो यह बात भी समझने लायक है की इंटरफ़ेस वेरिएबल में क्रिएट ऑब्जेक्ट को assign किया गया है।
अब इसका सबसे बड़ा फायदा यह होता है कि क्लाइंट के भीतर जब फैक्ट्री क्लास के स्टैटिक मेथड को इन्वोक अर्थात कॉल किया जाता है तब हम केवल इनपुट पैरामीटर देकर यह बता देते हैं कि हमें किस तरह का ऑब्जेक्ट क्रिएट करना है लेकिन ऑब्जेक्ट क्रिएट होने की सारी लॉजीक क्लाइंट को हिडन होती है। यह फैक्ट्री क्लास की रेस्पॉन्सिविटी होती है कि इनपुट पैरामीटर के आधार पर वह निश्चित करता है कि किस क्लास के ओबजेक्ट को क्रिएट करना है।
यद्यपि हमें सिंपल फैक्ट्री डिजाइन पैटर्न से कई सारी समस्याओं से निजात मिल जाता है परंतु फिर भी कई सारी समस्याएं बनी रह जाती है। उदाहरण के लिए जब क्लाइंट क्लास में फैक्ट्री क्लास के स्टैटिक मेथड को कॉल किया जाता है तो उस स्टैटिक मेथड में पैरामीटर पास किया जाता है जो निर्धारित करता है कि कौन से क्लास का ऑब्जेक्ट क्रिएट होगा तो अगर हम विचार करें तो हम पाएंगे कि यहां भी एक समस्या रह जाती है की इनपुट पैरामीटर को हमें कोड में बदलना होगा अगर हमें किसी अन्य तरह का ऑब्जेक्ट क्रिएट करना है। इस समस्या का हल हम किसी अन्य डिजाइन पैटर्न से कर सकते हैं इस पर हम आगे विचार करेंगे।
लेखक अजीत कुमार
No comments:
Post a Comment