सिंगलटन पैटर्न: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 64: Line 64:
}
}
</syntaxhighlight>
</syntaxhighlight>
प्रोग्राम आउटपुट है
प्रोग्राम आउटपुट है,


<वाक्यविन्यास प्रकाश लैंग = सी ++>
value=42
मान = 42
</वाक्यविन्यास हाइलाइट>


यह मेयर्स सिंगलटन का कार्यान्वयन है<ref>{{cite book |author=Scott Meyers |title=अधिक प्रभावी सी ++|publisher=Addison Wesley |year=1997 |isbn=0-201-63371-X |pages= 146 ff}}</ref> सी ++ 11 में। मेयर्स सिंगलटन की कोई विनाशकारी विधि नहीं है। कार्यक्रम का आउटपुट ऊपर जैसा है।
यह मेयर्स सिंगलटन का कार्यान्वयन है<ref>{{cite book |author=Scott Meyers |title=अधिक प्रभावी सी ++|publisher=Addison Wesley |year=1997 |isbn=0-201-63371-X |pages= 146 ff}}</ref> C ++ 11 में मेयर्स सिंगलटन की कोई विनाशकारी विधि नहीं है। कार्यक्रम का आउटपुट ऊपर जैसा है।


<syntaxhighlight lang="Cpp">
<syntaxhighlight lang="Cpp">

Revision as of 13:39, 26 May 2023

सिंगलटन पैटर्न का उदाहरण देने वाला एक वर्ग आरेख

सॉफ्टवेयर इंजीनियरिंग में, सिंगलटन पैटर्न सॉफ्टवेयर डिजाइन पैटर्न है जो वर्ग (कंप्यूटर प्रोग्रामिंग) के तात्कालिकता (कंप्यूटर साइंस) को विलक्षण उदाहरण तक सीमित करता है। प्रसिद्ध डिज़ाइन पैटर्न में से गैंग ऑफ़ फोर डिज़ाइन पैटर्न, जो वर्णन करता है कि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में आवर्ती समस्याओं का समाधान किया जाए।[1] [2] पैटर्न तब उपयोगी होता है जब किसी प्रणाली में क्रियाओं को समन्वित करने के लिए वास्तव में वस्तु की आवश्यकता होती है।

अधिक विशेष रूप से, सिंगलटन पैटर्न वस्तुओं को अनुमति देता है।[1]

शब्द सिंगलटन (गणित) से आता है।

सामान्य उपयोग

सिंगलटन को प्रायः वैश्विक चर के लिए सदृश किया जाता है, क्योंकि वे वैश्विक नाम स्थान (या उनके नाम स्थान) को प्रदूषित नहीं करते हैं। इसके अतिरिक्त, वे आलसी मूल्यांकन आवंटन और आरंभीकरण की अनुमति देते हैं, जबकि कई भाषाओं में वैश्विक चर सदैव संसाधनों का उपभोग करेंगे।[2][3] सिंगलटन पैटर्न का उपयोग अन्य डिज़ाइन पैटर्न के आधार के रूप में भी किया जा सकता है, जैसे कि सार फ़ैक्टरी पैटर्न, फैक्टरी विधि पैटर्न, बिल्डर पैटर्न और प्रोटोटाइप पैटर्न है। मुखौटा वस्तुएं भी प्रायः सिंगलटन होते हैं क्योंकि केवल एकल मुखौटा वस्तु की आवश्यकता होती है।

सिंगलटन के लिए सामान्य वास्तविक दुनिया का उपयोग विषय है, क्योंकि सभी ऑब्जेक्ट जो संदेशों को लॉग करना चाहते हैं, उन्हें समान पहुंच बिंदु की आवश्यकता होती है और वैचारिक रूप से स्रोत को लिखते हैं।[4]


कार्यान्वयन

सिंगलटन पैटर्न के कार्यान्वयन से यह सुनिश्चित होता है, कि सिंगलटन वर्ग का उदाहरण उपस्थित है और सामान्यतः उस उदाहरण के लिए वैश्विक पहुंच प्रदान करता है।

सामान्यतः, यह इसके द्वारा पूर्ण किया जाता है।

  • कक्षा के सभी निर्माणकर्ता (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) को निजी सदस्य घोषित करना, जो इसे अन्य वस्तुओं द्वारा त्वरित होने से रोकता है।
  • स्थिर विधि प्रदान करना जो उदाहरण के लिए संदर्भ (कंप्यूटर विज्ञान) लौटाता है।

उदाहरण सामान्यतः निजी स्थैतिक चर के रूप में संग्रहीत किया जाता है; उदाहरण तब बनाया जाता है जब चर को आरंभीकृत किया जाता है, कुछ समय पूर्व जब स्थैतिक विधि का प्रथम बार आह्वान किया जाता है।

यह C++11 कार्यान्वयन पुस्तक में पूर्व C++98 कार्यान्वयन पर आधारित होता है।

#include <iostream>

class Singleton {
public:
  // defines an class operation that lets clients access its unique instance.
  static Singleton& get() {
    // may be responsible for creating its own unique instance.
    if (nullptr == instance) instance = new Singleton;
    return *instance;
  }
  Singleton(const Singleton&) = delete; // rule of three
  Singleton& operator=(const Singleton&) = delete;
  static void destruct() {
    delete instance;
    instance = nullptr;
  }
  // existing interface goes here
  int getValue() {
    return value;
  }
  void setValue(int value_) {
    value = value_;
  }
private:
  Singleton() = default; // no public constructor
  ~Singleton() = default; // no public destructor
  static Singleton* instance; // declaration class variable
  int value;
};

Singleton* Singleton::instance = nullptr; // definition class variable

int main() {
  Singleton::get().setValue(42);
  std::cout << "value=" << Singleton::get().getValue() << '\n';
  Singleton::destruct();
}

प्रोग्राम आउटपुट है,

value=42

यह मेयर्स सिंगलटन का कार्यान्वयन है[5] C ++ 11 में मेयर्स सिंगलटन की कोई विनाशकारी विधि नहीं है। कार्यक्रम का आउटपुट ऊपर जैसा है।

#include <iostream>

class Singleton {
public:
  static Singleton& get() {
    static Singleton instance;
    return instance;
  }
  int getValue() {
    return value;
  }
  void setValue(int value_) {
    value = value_;
  }
private:
  Singleton() = default;
  ~Singleton() = default;
  int value;
};

int main() {
  Singleton::get().setValue(42);
  std::cout << "value=" << Singleton::get().getValue() << '\n';
}


आलसी आरंभीकरण

एक सिंगलटन कार्यान्वयन आलसी आरंभीकरण का उपयोग कर सकता है जिसमें स्टैटिक विधि को पहली बार लागू किए जाने पर उदाहरण बनाया जाता है। मल्टीथ्रेडिंग (सॉफ्टवेयर)सॉफ़्टवेयर) प्रोग्राम में, यह दौड़ की स्थिति स्थिति पैदा कर सकता है जिसके परिणामस्वरूप कई उदाहरण बनते हैं। निम्नलिखित जावा उदाहरण एक थ्रेड सुरक्षा है। थ्रेड-सुरक्षित कार्यान्वयन, डबल-चेक लॉकिंग के साथ आलसी प्रारंभिकरण का उपयोग कर रहा है।

public class Singleton {

    private static volatile Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }

        return instance;
    }
}


आलोचना

कुछ लोग सिंगलटन को एक एंटी-पैटर्न मानते हैं जो प्रायः अनावश्यक रूप से एक अनुप्रयोग में वैश्विक चर का परिचय देता है। यह अन्य वस्तुओं द्वारा सिंगलटन पर संभावित निर्भरता का परिचय देता है, यह निर्धारित करने के लिए कार्यान्वयन विवरण के विश्लेषण की आवश्यकता होती है कि निर्भरता वास्तव में उपस्थित है या नहीं।[6] यह बढ़ा हुआ युग्मन (कंप्यूटर प्रोग्रामिंग) इकाई परीक्षण के साथ कठिनाइयों का परिचय दे सकता है।[7] बदले में, यह सिंगलटन का उपयोग करने वाले किसी भी अमूर्तता पर प्रतिबंध लगाता है, जैसे कि Concurrency_(कंप्यूटर_साइंस) को कई उदाहरणों के उपयोग से रोकना।[7][8][9] सिंगलटन एकल-जिम्मेदारी सिद्धांत का भी उल्लंघन करते हैं क्योंकि वे अपने सामान्य कार्यों को करने के साथ-साथ अपनी विशिष्टता को लागू करने के लिए जिम्मेदार होते हैं।[7]


यह भी देखें

संदर्भ

  1. 1.0 1.1 "सिंगलटन डिज़ाइन पैटर्न - समस्या, समाधान और प्रयोज्यता". w3sDesign.com. Retrieved 2017-08-16.
  2. 2.0 2.1 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley. pp. 127ff. ISBN 0-201-63361-2.{{cite book}}: CS1 maint: multiple names: authors list (link)
  3. Soni, Devin (31 July 2019). "What Is a Singleton?". BetterProgramming. Retrieved 28 August 2021.
  4. Rainsberger, J.B. (1 July 2001). "अपने सिंगलटन का बुद्धिमानी से उपयोग करें". IBM. Archived from the original on 24 February 2021. Retrieved 28 August 2021.
  5. Scott Meyers (1997). अधिक प्रभावी सी ++. Addison Wesley. pp. 146 ff. ISBN 0-201-63371-X.
  6. "सिंगलटन विवादास्पद क्यों हैं". Google Code Archive. Archived from the original on 6 May 2021. Retrieved 28 August 2021.
  7. 7.0 7.1 7.2 Button, Brian (25 May 2004). "सिंगलटन ईविल क्यों हैं". Being Scott Densmore. Microsoft. Archived from the original on 15 July 2021. Retrieved 28 August 2021.
  8. Steve Yegge. Singletons considered stupid, September 2004
  9. Hevery, Miško, "Global State and Singletons", Clean Code Talks, 21 November 2008.


बाहरी संबंध