싱글턴(Singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 전형적인 예로 Statelesss 한 객체가 있다.
싱글턴은 클라이언트가 테스트하기 어려울 수 있다. 인터페이스로 정의해서 그 인터페이스를 구현하는 싱글턴이 아니라면, 싱글턴 인스턴스를 Mock 구현으로 대체할 수 없기 때문이다.
싱글턴을 만드는 방식은 보통 두가지다. 두 방식 모두 생성자는 private 으로 감춰두고, 유일한 인스턴스 접근 수단으로 public static
멤버를 하나 마련한다.
방법1️⃣
public static** **final
인 필드 방식
public class Elvis {
**public static final Elvis INSTANCE = new Elvis();**
private Elvis() { ... }
public void leaveTheBuilding() { ... }
}
private 생성자는 public static final
필드인 Elvis.INSTANCE
를 초기화할 때 딱 한 번만 호출된다.
→ Elvis 클래스가 초기화될 때 만들어진 인스턴스가 전체 시스템에서 하나뿐임이 보장된다.
이 방식의 장점은 다음과 같다.
public static
필드가 final
이므로, 절대 다른 객체를 참조할 수 없다.방법2️⃣ 정적 팩터리 메서드 방식:
public static
멤버로 제공
public class Elvis {
**private** static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
**public static Elvis getInstance()** { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
Elvis.getInstance
는 항상 같은 객체의 참조를 반환하기 때문에 시스템의 하나뿐임을 보장한다.