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