상위문서: GoF 디자인 패턴
인스턴스를 하나만 만들어 사용하기 위한 패턴이다. 즉 생성자의 호출이 반복적으로 이뤄져도 실제로 생성되는 객체는 최초 생성된 객체를 반환해주는 것이다.
커넥션 풀, 스레드 풀, 디바이스 설정 객체 등의 경우, 인스턴스를 여러개 만들게 되면 자원 낭비하게 되거나 버그를 발생시킬 수 있다. 그래서 오직 하나만 생성하고 그 인스턴스를 사용하도록 하는 것이 패턴의 목적이다.
public class ExampleClass {
//Instance
private static ExampleClass instance = new ExampleClass();
//private construct
private ExampleClass() {}
public static ExampleClass getInstance() {
return instance;
}
}
문제점은
1. 객체의 역할이 복잡한 경우에 해당 싱글톤 객체를 사용하는 객체간의 결합도가 높아져 객체 지향 설계 원칙에 어긋나게 된다.
2. 싱글톤 객체를 사용하는 곳에서 사이드 이펙트 발생 확률이 생기게 되며, 멀티 쓰레드 환경에서 동기화 처리 문제가 있을 수 있다.
참고로 Spring framework에서 자주 사용되는 싱글톤 객체는 기존 자바 싱글톤 객체와 생명주기가 다르다. 그리고 공유 범위 또한 자바는 Class loader 기준이지만 Spring 에서는 ApplicationContext가 기준이 된다.