싱글톤(Singleton) 패턴
소프트웨어 디자인 패턴에서 싱글톤 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.
싱글톤 패턴은 간단히 객체의 인스턴스를 한 개만 생성되게 하는 패턴이다.
public static final 필드 방식의 싱글톤
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
}
Elvis 클래스는 생성자가 private이기 때문에 Elvis.INSTANCE를 초기화할 때 딱 한번만 호출되며 외부에서 객체를 생성할 수 없다.
public static final 필드 방식은 해당 클래스가 싱글톤임이 API에서 명백히 드러나며(public static 필드가 final이니 절대 다른 객체를 참조할 수 없음) 코드가 간결해진다는 장점이 있다.
정적 팩토리 방식의 싱글톤
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
Elvis 클래스는 생성자가 private이고 Elvis.getInstance는 항상 같은 객체의 참조를 반환하므로 싱글톤 클래스이다.
정적 팩토리 방식은 이후에 해당 클래스를 싱글톤이 아니게 바꾸고 싶을 경우 API를 바꾸지 않고 변경이 가능해 유연한 코드 수정이 가능하다는 장점이 있다.
열거 타입 방식의 싱글톤
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
Enum은 생성자가 private이기 때문에 사용자가 생성자를 직접 호출할 수 없다. 따라서 public static final 방식과 비슷하지만 enum 특성상 코드가 더 간결하다. 대부분의 상황에서는 enum 방식의 싱글톤이 가장 좋은 방법이지만 만들려는 싱글톤이 다른 클래스를 상속해야 할 경우 이 방법은 사용할 수 없다.
'Study > 이펙티브 자바' 카테고리의 다른 글
[effectice java] item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2023.09.26 |
---|---|
[effectice java] item 2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2023.09.22 |
[effectice java] item 1. 생성자 대신 정적 팩토리 메소드를 고려하라 (0) | 2023.09.07 |