인스턴스를 오직 하나만 생성할 수 있는 클래스
함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트를 예로 들 수 있다.
클래스를 싱글턴으로 만들면, 이를 사용하는 클라이언트를 테스트할 때 어려울 수 있다.
타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다.
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
}
AccessibleObject
. setAccessible
을 사용해 private 생성자를 호출할 수 있다. 이러한 공격을 방어하려면 생성자를 수정하여 두 번 째 객체가 생성되려 할 때 예외를 던지게 하면 된다.public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getlnstanceO { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
단점은 위의 public 방식과 동일함
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}