종종 클래스와 인스턴스는 1:N 관계를 가진다. 그리고 인스턴스는 애플리케이션보다 짧은 라이프사이클을 가지며 생성되고 소멸되기를 반복한다.
하지만 단 하나의 인스턴스만을 가져야 하는 클래스도 있다. 팩토리 클래스 혹은 매니저 클래스 등이 그 예시인데, 이러한 클래스들은 애플리케이션이 시작했을 때 단 하나의 인스턴스가 출현하여 애플리케이션이 끝날 때 함께 사라져야 한다. 이러한 클래스의 인스턴스가 한 어플리케이션 내에서 여러 개가 만들어진다면 팩토리로 만드는 객체들에 대한 사무적인 제어가 불가능해지며, 둘 이상의 관리자가 있으면 순차적으로 하려고 했던 동작은 동시에 일어나게 될 것이다.
SINGLETON 패턴은 아주 단순한 패턴으로, 보통 아래와 같은 방식으로 구현된다.
public class Singleton {
private static Singleton theInstance = null;
private Singleton() {
...
}
public static Singleton Instance() {
if (theInstance == null) {
theInstance = new Singleton();
}
return theInstance;
}
}
SINGLETON 패턴은 클래스의 인스턴스를 오직 하나만 만드는 패턴이었다면, MONOSTATE 패턴은 어떤 클래스의 모든 인스턴스가 하나인 것처럼 동작하게 만드는 패턴이다. 이 패턴의 구현은 아래와 같이 이루어진다.
public class Monostate {
private static int itsX = 0;
public Monostate() {
...
}
public void setItsX(int x) {
itsX = x;
}
public int getItsX() {
return itsX;
}
}
어떤 클래스에 존재하는 멤버 변수는 곧 클래스의 상태라고 할 수 있다. MONOSTATE 패턴은 객체의 멤버 변수로 static한 변수만을 두어 모든 인스턴스가 단 하나의 상태를 공유하도록 한다.
명심해야할 두 패턴의 차이점은 '동작 대 구조'의 차이라는 것이다. SINGLETON은 구조적인 측면에서 단일성 있는 구조를 강제하는 반면, MONOSTATE는 클래스에 구조적인 제약을 부여하지는 않지만 단일성 있는 동작을 강제한다.