Design patterns
モノスター
サーチ…
備考
補足として、 Singleton
Monostate
パターンのいくつかの利点:
- クラスのインスタンスにアクセスするための 'instance`メソッドはありません。
-
Singleton
はJava Beanの表記法に準拠していませんが、Monostate
はそれにMonostate
ます。 - インスタンスの存続期間を制御できます。
- ユーザー
Monostate
、彼らが使用していることを知りませんMonostate
。 - 多型が可能です。
モノステートパターン
Monostate
パターンは、通常、 Singleton
パターンよりもシンタックスシュガーと呼ばれるか、 概念的Singleton
と呼ばれます。
クラスの単一のインスタンスを持つという複雑さをすべて回避しますが、すべてのインスタンスが同じデータを使用します。
これは主にstatic
データメンバーを使用して実行されます。
最も重要な機能の1つは、 Monostate
作業していることを完全に意識していないユーザーには絶対に透過的だということMonostate
。ユーザーは、 Monostate
インスタンスを必要な数だけ作成し、インスタンスにはデータにアクセスするためのインスタンスを作成することができます。
Monostate
クラスには通常、必要に応じて設定を更新するためのコンパニオンクラスがMonostate
されています。
これは、C ++のMonostate
最小限の例に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;
}
}
モノステートベースの階層
Singleton
とは対照的に、 Monostate
はメンバメソッドがstatic
ない限り、その機能を拡張するために継承されるのに適していstatic
。
これは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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow