싱글턴 패턴
- Coding/Java
- 2020. 11. 6.
싱글턴
싱글턴(Singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스이다. 무상태(stateless) 객체나 설계상 유일해야하는 시스템 컴포넌트이다. 싱글턴을 만드는 방식은 2가지가 있다. 첫번째는 public static final 필드 방식이고, 두번째는 정적 팩터리 메서드를 public static 멤버로 제공하는 방법이다. 2가지 방식의 공통점은 생성자는 private로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해두는 것이다.
public static final 필드 방식
public class Test {
public static final Test test = new Test();
private Test() { ... } // private 선언으로, 클래스 외부에서는 인스턴스 생성이 불가능하다.
public void isExist() { ... }
}
private 생성자는 public static final 필드인 Test.test를 초기화할때 딱 한번만 호출된다. public이나 protected 생성자가 없으므로 Test 클래스가 초기화될 때 만들어진 인스턴스가 전체 시스템에서 하나뿐임이 보장된다.
- 장점
1) 해당 클래스가 싱글턴임이 API에 명백하게 드러난다.
2) public static 필드가 final이므로 절대로 다른 객체를 참조할 수 없다.
정적 팩터리 메서드를 public static 멤버로 제공
public class Test {
public static final Test test = new Test();
private Test() { ... }
public static Test getTest() { return test; }
public void isExist() { ... }
}
Test.getTest()는 항상 같은 객체의 참조를 반환하므로 제 2의 Test 인스턴스가 만들어지지 않는다.
- 장점
1) API를 바꾸지 않고도 싱글턴이 아니게 변경할 수 있다.
2) 원한다면 정적 팩터리를 제네릭 싱글턴 팩터리로 만들 수 있따.
3) 정적 팩터리의 메서드 참조를 공급자로 사용할 수 있다. ex) Test::getTest -> Supplier 로 사용 가능
위 3가지 장점이 필요하지 않다면, 1)의 public 필드 방식이 좋다.
열거 타입 방식의 싱글턴
public enum Test {
INSTANCE;
public void isExist() { ... }
}
public 필드 방식과 비슷하지만, 더 간결하다. 대부분 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법이다. 단, 이 방법을 사용할때 만들려는 싱글턴이 Enum 이외에 클래스를 상속해야한다면, 이 방법을 사용할 수 없다.