खोज…


टिप्पणियों

साइड नोट के रूप में, Singleton पर Monostate पैटर्न के कुछ फायदे:

  • कक्षा के एक उदाहरण का उपयोग करने में सक्षम होने के लिए कोई 'इंस्टेंस' विधि नहीं है।
  • एक Singleton जावा बीन्स संकेतन के अनुरूप नहीं है, लेकिन एक Monostate करता है।
  • उदाहरणों के जीवनकाल को नियंत्रित किया जा सकता है।
  • Monostate उपयोगकर्ता यह नहीं जानते कि वे एक Monostate का उपयोग कर रहे हैं।
  • बहुरूपता संभव है।

मोनोस्टेट पैटर्न

Monostate पैटर्न आम तौर पर अधिक वाक्यात्मक चीनी के रूप में जाना जाता है Singleton पैटर्न या एक वैचारिक रूप Singleton

यह एक वर्ग के एकल उदाहरण होने की सभी जटिलताओं से बचा जाता है, लेकिन सभी उदाहरण एक ही डेटा का उपयोग करते हैं।
यह ज्यादातर static डेटा सदस्यों का उपयोग करके पूरा किया जाता है।
सबसे महत्वपूर्ण विशेषता यह है कि यह उपयोगकर्ताओं के लिए बिल्कुल पारदर्शी है, जो पूरी तरह से अनजान हैं कि वे एक Monostate साथ काम कर रहे हैं। यूजर्स जितना चाहें, Monostate एक Monostate बना सकते हैं और डेटा को एक्सेस करने के लिए दूसरा इंस्टेंस अच्छा है।

Monostate वर्ग आमतौर पर एक साथी वर्ग के साथ आता है जिसका उपयोग सेटिंग्स को अद्यतन करने के लिए किया जाता है यदि आवश्यक हो।

यह C ++ में एक Monostate न्यूनतम उदाहरण का अनुसरण करता है:

struct Settings {
    Settings() {
        if(!initialized) {
            initialized = true;
            // load from file or db or whatever
            // otherwise, use the SettingsEditor to initialize settings
            Settings::width_ = 42;
            Settings::height_ = 128;
        }
    }

    std::size_t width() const noexcept { return width_; }
    std::size_t height() const noexcept { return height_; }

private:
    friend class SettingsEditor;

    static bool initialized;
    static std::size_t width_;
    static std::size_t height_;
};

bool Settings::initialized = false;
std::size_t Settings::width_;
std::size_t Settings::height_;

struct SettingsEditor {
    void width(std::size_t value) noexcept { Settings::width_ = value; }
    void height(std::size_t value) noexcept { Settings::height_ = value; }
};

यहाँ जावा में एक Monostate सरल कार्यान्वयन का एक Monostate गया है:

public class Monostate {
    private static int width;
    private static int height;

    public int getWidth() {
        return Monostate.width;
    }

    public int getHeight() {
        return Monostate.height;
    }

    public void setWidth(int value) {
        Monostate.width = value;
    }

    public void setHeight(int value) {
        Monostate.height = value;
    }

    static {
        width = 42;
        height = 128;
    }
}

मोनोस्टेट-आधारित पदानुक्रम

Singleton विपरीत, Monostate को अपनी कार्यक्षमता बढ़ाने के लिए विरासत में प्राप्त करने के लिए उपयुक्त है, जब तक कि सदस्य विधियां static न हों।
यह C ++ में एक न्यूनतम उदाहरण का अनुसरण करता है:

struct Settings {
    virtual std::size_t width() const noexcept { return width_; }
    virtual std::size_t height() const noexcept { return height_; }

private:
    static std::size_t width_;
    static std::size_t height_;
};

std::size_t Settings::width_{0};
std::size_t Settings::height_{0};

struct EnlargedSettings: Settings {
    std::size_t width() const noexcept override { return Settings::height() + 1; }
    std::size_t height() const noexcept override { return Settings::width()  + 1; }
};


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow