Suche…


Bemerkungen

Als Monostate einige Vorteile des Monostate Musters gegenüber Singleton :

  • Es gibt keine "Instanz" -Methode, um auf eine Instanz der Klasse zugreifen zu können.
  • Ein Singleton entspricht nicht der Java-Beans-Notation, ein Monostate jedoch.
  • Die Lebensdauer von Instanzen kann kontrolliert werden.
  • Benutzer von Monostate wissen nicht, dass sie Monostate .
  • Polymorphismus ist möglich.

Das monostatische Muster

Das Monostate Muster wird normalerweise als syntaktischer Zucker über dem Singleton Muster oder als konzeptionelles Singleton .

Es vermeidet alle Komplikationen einer einzigen Instanz einer Klasse, aber alle Instanzen verwenden dieselben Daten.
Dies wird hauptsächlich durch die Verwendung static Datenelemente erreicht.
Eine der wichtigsten Funktionen ist, dass es für die Benutzer absolut transparent ist, die nicht wissen, dass sie mit einem Monostate . Benutzer können so viele Instanzen eines Monostate erstellen, wie sie möchten, und jede Instanz ist gut für den Zugriff auf die Daten.

Die Monostate Klasse enthält normalerweise eine Begleiterklasse, mit der die Einstellungen bei Bedarf aktualisiert werden.

Es folgt ein minimales Beispiel eines Monostate in C ++:

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; }
};

Hier ist ein Beispiel für eine einfache Implementierung eines Monostate in Java:

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;
    }
}

Monostate-basierte Hierarchien

Im Gegensatz zum Singleton ist das Monostate geeignet, um seine Funktionalitäten zu erweitern, solange die Member-Methoden nicht static .
Es folgt ein minimales Beispiel in 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow