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