Monostate 模式

Monostate 模式通常被稱為 Singleton 模式的語法糖概念 Singleton

它避免了具有單個類例項的所有複雜性,但所有例項都使用相同的資料。
這主要通過使用 static 資料成員來完成。
其中一個最重要的特點是它對使用者來說絕對透明,完全沒有意識到他們正在使用 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; }
};

以下是 Java 中 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;
    }
}