싱글턴(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 클래스가 초기화될 때 만들어진 인스턴스가 전체 시스템에서 하나뿐임이 보장된다.

이 방식의 장점은 다음과 같다.

방법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 는 항상 같은 객체의 참조를 반환하기 때문에 시스템의 하나뿐임을 보장한다.