CodeGym /Java Blog /अनियमित /जावा में पैटर्न और सिंगलटन
John Squirrels
स्तर 41
San Francisco

जावा में पैटर्न और सिंगलटन

अनियमित ग्रुप में प्रकाशित
यह लेख किसी ऐसे व्यक्ति के लिए लक्षित है, जो पहली बार डिजाइन पैटर्न की अवधारणा का सामना कर रहा है, जिसने सिंगलटन शब्द सुना है , या किसी तरह सिंगलटन पैटर्न को लागू किया है, लेकिन यह नहीं समझ पाया कि क्या हो रहा है। स्वागत! CodeGym के छात्रों को पहली बार स्तर 15 पर डिजाइन पैटर्न का सामना करना पड़ता है, जब कप्तान अप्रत्याशित रूप से उनसे आलसी कार्यान्वयन के साथ जावा सिंगलटन पैटर्न को लागू करके अपनी समझ को "मजबूत" करने के लिए कहते हैं। पहली बार सिंगलटन पैटर्न के बारे में सुनने वाले छात्रों के पास तुरंत बहुत सारे प्रश्न होते हैं: दुनिया में डिज़ाइन पैटर्न क्या है? हमें इसकी जरूरत क्यों है? सिंगलटन क्या है ? और अंत में, आलसी क्रियान्वयन क्या है? आइए इन सवालों के जवाब क्रम से दें।

डिज़ाइन पैटर्न दुनिया में क्या है?

मेरा मानना ​​है कि इस प्रश्न का सर्वोत्तम समझ के साथ उत्तर देने के लिए थोड़ा इतिहास है। चार प्रसिद्ध प्रोग्रामिंग लेखक (एरिच गामा, जॉन व्लिससाइड्स, राल्फ जॉनसन और रिचर्ड हेल्म) हैं जो एक दिलचस्प विचार लेकर आए हैं। उन्होंने देखा कि सॉफ़्टवेयर विकास के लिए अक्सर उन्हें लगभग समान समस्याओं को हल करने और उसी तरह से संरचित कोड लिखने की आवश्यकता होती है। इसलिए उन्होंने विशिष्ट पैटर्न का वर्णन करने का निर्णय लिया, जिन्हें अक्सर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में उपयोग करने की आवश्यकता होती है। उनकी पुस्तक 1994 में डिजाइन पैटर्न: एलिमेंट्स ऑफ रियूजेबल ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर शीर्षक के तहत प्रकाशित हुई थी। पुस्तक का नाम बहुत लंबा हो गया और लोग इसे केवल गैंग ऑफ फोर की पुस्तक कहने लगे। पहले संस्करण में 23 पैटर्न शामिल थे। बाद में, दर्जनों अन्य पैटर्न खोजे गए।
एक डिज़ाइन पैटर्न एक सामान्य समस्या का एक मानकीकृत समाधान है।
और सिंगलटन पैटर्न उनमें से सिर्फ एक है।

हमें डिज़ाइन पैटर्न की आवश्यकता क्यों है?

आप पैटर्न जाने बिना प्रोग्राम कर सकते हैं: आखिरकार, स्तर 15 तक, आप CodeGym पर पहले ही सैकड़ों मिनी-प्रोग्राम लिख चुके होते हैं, बिना यह जाने कि वे मौजूद हैं। इससे पता चलता है कि डिज़ाइन पैटर्न एक प्रकार का उपकरण है जिसका उपयोग मास्टर को शौकिया से अलग करता है: डिज़ाइन पैटर्न वर्णन करता है कि किसी विशिष्ट समस्या को ठीक से कैसे हल किया जाए। इसका मतलब है कि पैटर्न जानने से आपका समय बचता है। इस तरह, वे एल्गोरिदम के समान हैं। उदाहरण के लिए, आप ब्लैकजैक और संख्याओं के साथ अपना खुद का सॉर्टिंग एल्गोरिद्म बना सकते हैंऔर ऐसा करने में बहुत समय व्यतीत करें, या आप उस एक को लागू कर सकते हैं जिसे लंबे समय से समझा और वर्णित किया गया है। डिजाइन पैटर्न के साथ भी यही सच है। इसके अतिरिक्त, डिज़ाइन पैटर्न के साथ, कोड अधिक मानक बन जाता है, और उपयुक्त पैटर्न का उपयोग करते समय, आपसे गलतियाँ होने की संभावना कम होती है, क्योंकि पैटर्न के सामान्य नुकसान की पहचान की गई थी और बहुत पहले ही समाप्त कर दी गई थी। बाकी सब चीजों के ऊपर, पैटर्न का ज्ञान प्रोग्रामरों को एक दूसरे को बेहतर ढंग से समझने में मदद करता है। आप अपने साथी प्रोग्रामरों को लंबी व्याख्या देने की कोशिश करने के बजाय बस एक पैटर्न का नाम बोल सकते हैं। संक्षेप में, डिजाइन पैटर्न आपकी मदद करते हैं:
  • पहिए का फिर से आविष्कार न करें, बल्कि इसके बजाय मानक समाधानों का उपयोग करें;
  • मानकीकृत कोड;
  • शब्दावली का मानकीकरण;
इस खंड को समाप्त करने के लिए, हम ध्यान दें कि डिज़ाइन पैटर्न के पूरे शरीर को तीन बड़े समूहों में विभाजित किया जा सकता है: पैटर्न और सिंगलटन - पहली बार उनका सामना करने वाले सभी लोगों के लिए - 2

अंत में, सिंगलटन पैटर्न

सिंगलटन एक रचनात्मक पैटर्न है । यह पैटर्न सुनिश्चित करता है कि एक वर्ग का केवल एक ही उदाहरण है और इस वस्तु के लिए एक वैश्विक पहुँच बिंदु प्रदान करता है। विवरण से, यह स्पष्ट होना चाहिए कि यह पैटर्न दो मामलों में लागू किया जाना चाहिए:
  1. जब आपके प्रोग्राम के लिए आवश्यक है कि किसी विशेष वर्ग की एक से अधिक वस्तु नहीं बनाई जानी चाहिए। उदाहरण के लिए, एक कंप्यूटर गेम में हीरो क्लास और केवल एक हीरो ऑब्जेक्ट हो सकता है जो गेम में एकमात्र हीरो का वर्णन करता है।

  2. जब आपको किसी वस्तु तक वैश्विक पहुँच के लिए एक बिंदु प्रदान करने की आवश्यकता होती है। दूसरे शब्दों में, आपको प्रोग्राम में कहीं से भी वस्तु उपलब्ध कराने की आवश्यकता है। काश, यह केवल एक वैश्विक चर बनाने के लिए पर्याप्त नहीं है, क्योंकि यह लेखन-संरक्षित नहीं है: कोई भी चर के मान को बदल सकता है, इसलिए वस्तु का वैश्विक पहुंच बिंदु खो सकता है। सिंगलटन के ये गुण आवश्यक हैं, उदाहरण के लिए, जब आपके पास एक ऑब्जेक्ट है जो डेटाबेस के साथ काम करता है, और आपको प्रोग्राम के विभिन्न हिस्सों से डेटाबेस तक पहुंचने की आवश्यकता होती है। एक सिंगलटन यह सुनिश्चित करेगा कि कोई भी ऐसा कोड न लिखे जो पहले बनाए गए उदाहरण को बदल दे।
तो एक सिंगलटन इन दो जरूरतों को पूरा करता है: कार्यक्रम में केवल एक निश्चित प्रकार की वस्तु होनी चाहिए और इसकी वैश्विक पहुंच होनी चाहिए। लेवल 15 के उदाहरण में, कप्तान आपको निम्नलिखित कार्य के लिए इस पैटर्न को लागू करने के लिए कहता है:
  1. लेज़ी इनिशियलाइज़ेशन के साथ सिंगलटन का एक उदाहरण खोजें ।

  2. एक ही सिद्धांत का उपयोग करके अलग-अलग फाइलों में तीन सिंगलटन वर्ग - सूर्य, चंद्रमा, पृथ्वी - बनाएं।

  3. अमल में लानाग्रहसूर्य , चंद्रमा और पृथ्वी कक्षाओं में इंटरफ़ेस ।

  4. समाधान वर्ग के स्थिर ब्लॉक में कॉल करेंreadKeyFromConsoleAndInitPlanetतरीका।

  5. लागू करेंreadKeyFromConsoleAndInitPlanetविधि कार्यक्षमता:

    • 5.1। कंसोल से एक स्ट्रिंग पैरामीटर पढ़ें

    • 5.2। यदि पैरामीटर एक के बराबर हैग्रहइंटरफ़ेस के स्थिरांक, उपयुक्त ग्रह वस्तु बनाएँ।

कार्य की शर्तों को ध्यान से पढ़ने के बाद, हम स्पष्ट रूप से देख सकते हैं कि यहाँ सिंगलटन की आवश्यकता क्यों है। दरअसल, हमें निम्नलिखित वर्गों में से प्रत्येक का उदाहरण बनाने के लिए कहा जाता है: Sun , Moon , Earth । यह मानने में समझदारी है कि हमें एक से अधिक सूर्य/चंद्रमा/पृथ्वी का निर्माण नहीं करना चाहिए। अन्यथा, हम एक बेतुकी स्थिति में पड़ जाते हैं, जब तक कि आप निश्चित रूप से स्टार वार्स का अपना संस्करण नहीं लिख रहे हैं। जावा में सिंगलटन पैटर्न को तीन चरणों में लागू करना जावा में, सिंगलटन व्यवहार को एक साधारण कंस्ट्रक्टर का उपयोग करके लागू नहीं किया जा सकता है, क्योंकि एक कंस्ट्रक्टर हमेशा एक नई वस्तु देता है। इसलिए, सिंगलटन के सभी कार्यान्वयनकन्स्ट्रक्टर को छिपाने के लिए उबाल लें, एक सार्वजनिक स्थैतिक विधि बनाएं जो सिंगलटन ऑब्जेक्ट के जीवनकाल को नियंत्रित करे, और सभी नई दिखने वाली वस्तुओं को "नष्ट" कर दे। यदि सिंगलटन का उपयोग किया जाता है, तो उसे या तो एक नई वस्तु बनानी चाहिए (यदि कोई प्रोग्राम में पहले से मौजूद नहीं है), या किसी मौजूदा को वापस कर दें। यह प्राप्त करने के:
  1. आपको कक्षा को एक निजी स्थिर क्षेत्र देने की आवश्यकता है जो एक वस्तु को संग्रहीत करता है:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance; // #1
    }
    
  2. (डिफ़ॉल्ट) कन्स्ट्रक्टर को निजी बनाएं। इसका मतलब है कि इसे कक्षा के बाहर नहीं पहुँचा जा सकता है और यह नई वस्तुओं को वापस करने में सक्षम नहीं होगा:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance;
    private LazyInitializedSingleton(){} // #2
    } 
    
  3. एक स्थिर निर्माण विधि की घोषणा करें जिसका उपयोग सिंगलटन प्राप्त करने के लिए किया जाएगा:

    
    public class LazyInitializedSingleton {
        private static LazyInitializedSingleton instance;
            private LazyInitializedSingleton() {}
            public static LazyInitializedSingleton getInstance() { // #3
            if (instance == null) { // If the object has not yet been created
                instance = new LazyInitializedSingleton(); // Create a new object
            }
            return instance; // Return the previously created object
        }
    }
    
उपरोक्त उदाहरण कुछ अनाड़ी है, क्योंकि हम केवल कंस्ट्रक्टर को छिपाते हैं और मानक कंस्ट्रक्टर के बजाय अपनी खुद की विधि प्रदान करते हैं। चूंकि इस लेख का उद्देश्य यह सुनिश्चित करना है कि CodeGym के छात्र इस पैटर्न (और सामान्य रूप से डिजाइन पैटर्न) के संपर्क में आएं, इसलिए अधिक जटिल सिंगलटन कार्यान्वयन की बारीकियों का वर्णन यहां नहीं किया जाएगा। हम केवल यह नोट करते हैं कि कार्यक्रम की जटिलता के आधार पर, इस पैटर्न को और अधिक परिष्कृत करने की आवश्यकता हो सकती है। उदाहरण के लिए, एक बहुप्रचारित वातावरण में (धागे के बारे में लेख देखें), कई अलग-अलग धागे एक साथ सिंगलटन विधि तक पहुँच सकते हैं, और ऊपर वर्णित कोड काम करना बंद कर देगा, क्योंकि प्रत्येक अलग धागा वर्ग का एक उदाहरण बना सकता है। नतीजतन, उचित थ्रेड-सुरक्षित सिंगलटन बनाने के लिए अभी भी कई अलग-अलग दृष्टिकोण हैं। लेकिन वह एक और कहानी है =)

और अंत में... यह क्या आलसी पहल है जिसके बारे में कप्तान ने पूछा?

लेज़ी इनिशियलाइज़ेशन को आस्थगित इनिशियलाइज़ेशन भी कहा जाता है। यह प्रोग्रामिंग ट्रिक है जहां एक संसाधन-गहन ऑपरेशन (और एक वस्तु बनाना एक संसाधन-गहन ऑपरेशन है) अग्रिम के बजाय मांग पर किया जाता है। तो वास्तव में हमारे सिंगलटन जावा कोड में क्या होता है? दूसरे शब्दों में, हमारा ऑब्जेक्ट उस समय बनाया जाता है जब इसे एक्सेस किया जाता है, पहले से नहीं। आपको यह नहीं मानना ​​​​चाहिए कि आलसी प्रारंभिकरण किसी भी तरह से सिंगलटन पैटर्न से जुड़ा हुआ है। आलसी इनिशियलाइज़ेशन का उपयोग अन्य रचनात्मक डिज़ाइन पैटर्न में भी किया जाता है, जैसे कि प्रॉक्सी और फ़ैक्टरी मेथड, लेकिन यह भी एक और कहानी है =)
टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION