수색…


비고

보조 노트로서, Singleton 비해 Monostate 패턴의 몇 가지 장점은 다음과 같습니다.

  • 클래스의 인스턴스에 액세스 할 수있는 '인스턴스'메소드는 없습니다.
  • Singleton 은 Java bean 표기법을 따르지 않지만 Monostate 는 준수합니다.
  • 인스턴스의 수명을 제어 할 수 있습니다.
  • 의 사용자 Monostate 그들이 사용하고 있는지 모르는 Monostate .
  • 다형성이 가능합니다.

모노 스테이트 패턴

Monostate 패턴은 일반적으로 Singleton 패턴이나 개념적 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;
    }
}

모노 스테이트 기반 계층 구조

Singleton 과 달리 Monostate 는 멤버 메소드가 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