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