Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में सिंगलटन क्लास कैसे लिखें?

सिंगलटन डिज़ाइन पैटर्न

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

क्लासिक कार्यान्वयन

#include <iostream>
using namespace std;

class Singleton {
    static Singleton* instance;
    int data;
    
    // प्राइवेट कंस्ट्रक्टर ताकि कोई ऑब्जेक्ट न बनाया जा सके
    Singleton() {
        data = 0;
    }
    
public:
    static Singleton* getInstance() {
        if (!instance)
            instance = new Singleton;
        return instance;
    }
    
    int getData() {
        return this->data;
    }
    
    void setData(int data) {
        this->data = data;
    }
};

// पॉइंटर को इनिशियलाइज़ करें ताकि getInstance के पहले कॉल पर इनिशियलाइज़ हो सके
Singleton* Singleton::instance = 0;

int main() {
    Singleton* s = Singleton::getInstance();  // सही: स्टेटिक मेथड कॉल
    cout << s->getData() << endl;
    s->setData(100);
    cout << s->getData() << endl;
    return 0;
}

आउटपुट

0
100

उपरोक्त कार्यान्वयन में समस्याएं

  • थ्रेड-असेफ: मल्टी-थ्रेडेड वातावरण में रेस कंडीशन
  • मेमोरी लीक: इंस्टेंस कभी डिलीट नहीं होता
  • डिस्ट्रक्शन ऑर्डर: स्टेटिक डिस्ट्रक्शन ऑर्डर समस्या

बेहतर कार्यान्वयन: मेयर्स सिंगलटन (C++11 थ्रेड-सेफ)

#include <iostream>
using namespace std;

class Singleton {
private:
    Singleton() : data(0) {}           // प्राइवेट कंस्ट्रक्टर
    ~Singleton() {}                    // प्राइवेट डिस्ट्रक्टर
    Singleton(const Singleton&) = delete;            // कॉपी रोकें
    Singleton& operator=(const Singleton&) = delete; // असाइनमेंट रोकें
    Singleton(Singleton&&) = delete;                 // मूव रोकें
    Singleton& operator=(Singleton&&) = delete;
    
    int data;
    
public:
    static Singleton& getInstance() {
        static Singleton instance;  // C++11: थ्रेड-सेफ इनिशियलाइज़ेशन
        return instance;
    }
    
    int getData() const { return data; }
    void setData(int d) { data = d; }
};

int main() {
    Singleton& s = Singleton::getInstance();
    cout << s.getData() << endl;
    s.setData(100);
    cout << s.getData() << endl;
    return 0;
}

मेयर्स सिंगलटन के लाभ

  • थ्रेड-सेफ: C++11 गारंटी देता है कि स्टेटिक लोकल वेरिएबल इनिशियलाइज़ेशन थ्रेड-सेफ है
  • लेजी इनिशियलाइज़ेशन: पहली उपयोग पर बनाया जाता है
  • ऑटोमैटिक क्लीनअप: प्रोग्राम एग्जिट पर डिस्ट्रॉय होता है
  • कॉपी/मूव रोका गया: = delete के साथ
  • रेफरेंस रिटर्न करता है: नल चेक की आवश्यकता नहीं

अन्य विचार

  • निर्भरता इंजेक्शन: सिंगलटन के बजाय निर्भरताओं को पास करने पर विचार करें
  • टेस्टेबिलिटी: सिंगलटन्स टेस्टिंग को कठिन बनाते हैं (मॉक करना मुश्किल)
  • ग्लोबल स्टेट: सिंगलटन्स अनिवार्य रूप से ग्लोबल स्टेट हैं - संयम से उपयोग करें
  1. Android में सिंगलटन क्लास का उपयोग कैसे करें? Android में सिंगलटन क्लास का उपयोग कैसे करें?

    सिंगलटन डिज़ाइन पैटर्न सिंगलटन एक डिज़ाइन पैटर्न है जो किसी क्लास के इंस्टेंशिएशन को केवल एक इंस्टेंस तक सीमित करता है। यह कंकरेंसी नियंत्रण और डेटा स्टोर तक केंद्रीय पहुंच प्रदान करने के लिए उपयोगी है। उदाहरण: डेटा स्टोरेज के लिए सिंगलटन क्लास यह उदाहरण दर्शाता है कि सिंगलटन क्लास में टेक्स्ट डेटा

  1. - Java में क्लास को सिंगलटन कैसे बनाएं?

    सिंगलटन क्लास एक ऐसी क्लास है जिसमें केवल एक ऑब्जेक्ट होता है, जिसका अर्थ है कि हम क्लास को केवल एक बार इंस्टेंटिएट कर सकते हैं। जब हम क्लास के कंस्ट्रक्टर को प्राइवेट घोषित करते हैं, तो यह ऑब्जेक्ट निर्माण के दायरे को सीमित कर देगा। यदि हम ऑब्जेक्ट के इंस्टेंस को स्टैटिक मेथड में लौटाते हैं, तो हम

  1. - Python में सिंगलटन क्लास कैसे बनाएं?

    सिंगलटन पैटर्न क्लास के इंस्टेंस की संख्या को एक तक सीमित करने की रणनीति प्रदान करता है। इस प्रकार वही ऑब्जेक्ट कोड के विभिन्न हिस्सों द्वारा हमेशा शेयर किया जाता है। सिंगलटन को ग्लोबल वेरिएबल की तुलना में अधिक सुंदर समाधान माना जा सकता है क्योंकि वास्तविक डेटा सिंगलटन क्लास इंटरफेस के पीछे छिपा हो