サーチ…


備考

補足として、 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