Design patterns
모노 스테이트
수색…
비고
보조 노트로서, 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