Monday, November 1, 2021

C# Singleton Design Pattern in Hindi

सिंगलटन डिजाइन पेटर्न एक ऐसा डिजाइन पेटर्न है जिसके अंतर्गत एक क्लास का एक और मात्र एक ऑब्जेक्ट निर्मित किया जाना संभव होता है। इस क्लास के भीतर ही इसके इकलौते ऑब्जेक्ट को निर्मित करने से सम्बंधित स्टेटिक मेथड होता है। इस मेथड के स्टेटिक होने के कारण को हम आगे समझेंगे।

सिंगलटन डिजाइन पेटर्न व्यावहारिक परिस्थितियों की आवश्यकता को ध्यान में रखते हुए विकसित किया गया है। व्यावहारिक परिस्थितियों में कई बार ऐसा होता है कि किसी प्रोजेक्ट में केवल एक ही ऑब्जेक्ट के निर्माण की आवश्यकता होती है। जैसे डेटाबेस के साथ कनेक्शन के लिए कनेक्शन ऑब्जेक्ट का निर्माण करना। डाटाबेस से कनेक्शन के लिए एक ही कनेक्शन ऑब्जेक्ट की आवश्यकता होती है, उससे ज्यादा कनेक्शन ऑब्जेक्ट की आवश्यकता नहीं होती है। ऐसे कई सारे व्यावहारिक उदाहरण है जहां किसी क्लास के केवल एक ही ऑब्जेक्ट के निर्माण की जरूरत होती है। इन परिस्थितियों में सिंगलटन डिजाइन पेटर्न का उपयोग किया जाता है। 

प्रश्न उत्पन्न होता है कि इस आवश्यकता की पूर्ति के लिए क्या प्रोग्रामिंग लॉजिक होनी चाहिए?

प्रथम शर्त:- प्राइवेट कंस्ट्रक्टर

यदि हम चाहते हैं कि किसी क्लास X का एक से अधिक ऑब्जेक्ट ना बने तो इसके लिए सबसे पहली शर्त यह है कि किसी भी दूसरे क्लास के द्वारा क्लास X के ऑब्जेक्ट का निर्माण संभव नहीं होना चाहिए। क्योंकि, अगर कोई यादृच्छिक क्लास, क्लास X का ऑब्जेक्ट बना सकता है तो अन्य क्लास भी क्लास X का ऑब्जेक्ट बना पाएगा। ऐसी स्थिति में हम क्लास X का एक से ज्यादा ऑब्जेक्ट बनाना रोक नहीं सकते। अतः यह स्पष्ट है कि क्लास X के ऑब्जेक्ट का निर्माण अन्य क्लास के द्वारा बाधित होना चाहिए। ऐसा करने के लिए क्लास X के कंस्ट्रक्टर को प्राइवेट कंस्ट्रक्टर होना चाहिए। प्राइवेट कंस्ट्रक्टर होने पर कोई भी अन्य क्लास, क्लास X का ऑब्जेक्ट नहीं बना सकता। इसका corollary यह है कि क्लास X के भीतर ही क्लास X के ऑब्जेक्ट के निर्माण की लॉजिक होनी चाहिए। ऑब्जेक्ट के निर्माण के लिए क्लास के भीतर मेथड होना चाहिए। अंततः new ऑपरेटर और प्राइवेट कंस्ट्रक्टर की सहायता से, क्लास X के इस मेथड के भीतर उसका ऑब्जेक्ट बनाया जाता हैं। मेथड का कोई सार्थक नाम जैसे GetObject दे सकते हैं।

द्वितीय शर्त:- मेथड स्टेटिक होना चाहिए।

किसी क्लास के मेथड को एक्सेस करने के लिए दो उपाय है। पहला तरीका यह है कि क्लास का ऑब्जेक्ट बनाया जाए और उस ऑब्जेक्ट के द्वारा क्लास के मेथड को एक्सेस किया जाए। दूसरा तरीका यह है कि मेथड को स्टैटिक बना दिया जाए और उस क्लास की सहायता से उसे एक्सेस किया जाए। चूँकि क्लास X में प्राइवेट कंस्ट्रक्टर है, अतः उसका कोई ऑब्जेक्ट दूसरे क्लास द्वारा नहीं बनाया जा सकता है अतः दूसरा तरीका ही सम्भव है। अतः GetObject मेथड को स्टेटिक मेथड बना कर क्लास X द्वारा एक्सेस किया जा सकता है। उदाहरण के लिए, निम्नलिखित कोड में Printer क्लास का GetPrinter एक स्टेटिक मेथड है। 

(नोट:- मेथड एक्सेस का एक अन्य साधन डिलीगेट है जिसकी मदद से किसी मेथड को एक्सेस किया जा सकता है।)

तीसरी शर्त:- स्टेटिक मेथड के भीतर ऐसा लॉजिक होना चाहिए ताकि क्लास X के एक ही ऑब्जेक्ट का निर्माण हो। निम्नलिखित कोड में, if statement द्वारा यह लक्ष्य सिद्ध किया गया है।

  
namespace DesignPatterns.Singleton
{
    public class Printer
    {
        static Printer printer;
        private Printer()
        {
            //to prevent object creation of this class by other classes
        }
        
        public static Printer GetPrinter()
        {
            if (printer == null)
                printer = new Printer();
            return printer;
        }


    }
}
using DesignPatterns.Singleton;
using System;

namespace DesignPatterns
{
    class Program
    {
        static void Main(string[] args)
        {
            Printer printer1 = Printer.GetPrinter();
            Printer printer2 = Printer.GetPrinter();
            int printer1HashCode = printer1.GetHashCode();
            int printer2HashCode = printer1.GetHashCode();
            Console.WriteLine(printer1HashCode);
            Console.WriteLine(printer2HashCode);
            if (printer1HashCode== printer2HashCode)
            {
                Console.WriteLine("Both objects are same.");
            }
            else
            {
                Console.WriteLine("Both objects are not same.");
            }
            Console.ReadKey();
        }
    }
}
ध्यान दीजिए कि इकलौते ऑब्जेक्ट को रिटर्न करने के लिए स्टेटिक मेथड के भीतर conditional लॉजिक लिखा गया है। यही काम get accessor के भीतर भी कर सकते हैं। ऐसा करने पर क्लास के मेथड की बजाय प्रोपर्टी का उपयोग किया जाता है।
namespace DesignPatterns.Singleton
{
    public class Printer
    {
        static Printer instance;
        private Printer()
        {
            //to prevent object creation of this class by other classes
        }
        //using property
        public static Printer Instance
        {
            get
            {
                if (instance == null)
                    instance = new Printer();
                return instance;
            }
        }


    }
}
using DesignPatterns.Singleton;
using System;

namespace DesignPatterns
{
    class Program
    {
        static void Main(string[] args)
        {
            Printer printer1 = Printer.Instance;
            Printer printer2 = Printer.Instance;
            int printer1HashCode = printer1.GetHashCode();
            int printer2HashCode = printer1.GetHashCode();
            Console.WriteLine(printer1HashCode);
            Console.WriteLine(printer2HashCode);
            if (printer1HashCode== printer2HashCode)
            {
                Console.WriteLine("Both objects are same.");
            }
            else
            {
                Console.WriteLine("Both objects are not same.");
            }
            Console.ReadKey();
        }
    }
}

© अजीत कुमार, सर्वाधिकार सुरक्षित।

इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।


No comments:

Post a Comment

Hot Topics