소프트웨어 공학에서 싱글톤 패턴이란 하나의 클래스가 오직 하나의 오브젝트만 생성하고, 이것을 전역적으로 접근할 수 있게 하는 디자인 패턴이다. 이는 전체 프로그램에서 오브젝트가 오직 하나만 생성되어야 하는 경우에 사용한다.
이전부터 개발자들에게 간간히 쓰여졌는데, 폭발적으로 알려지게 된 계기는 이른바 GoF, Gang of Four라고 알려진 책 Design Patterns: Elements of Reusable Object-Oriented Software을 통해 사람들에게 널리 알려졌기 때문이다.
자바에선 일반적으로 두가지 방법이 사용된다.
게으른 초기화 Lazy initialization
public class SingletonDemo {
private static SingletonDemo instance = null; // =null은 생략해도 무관. 싱글톤 데모 클래스에 대해 레퍼런스 변수만 선언
private SingletonDemo() {} //private 생성자를 만들어서 다른곳에서 객체를 생성하지 못하게 한다.
public static SingletonDemo getInstance() { //public getInstance 메소드로 다른곳에서 접근 가능하게 만든다.
if (instance == null) {
instance = new SingletonDemo (); 싱글톤 객체 생성
}
return instance;
}
}
이경우 멀티쓰레드 프로그램에서 두 개 이상의 쓰레드가 같은 클래스를 참조할 때 문제가 되기 때문에 Double Checked Locking을 사용하여 인스턴스가 생성되었는지 확인 후 생성되어있지 않을 때 동기화한다.
public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo() { }
public static SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo .class){
if (instance == null) {
instance = new SingletonDemo ();
}
}
}
return instance;
}
}
부지런한 초기화 Eager initialization
번역은 임의로 하였으며 이것이 표준적으로 사용되는 말은 아니다
부지런한 초기화는 프로그램이 항상 인스턴스가 필요할 때나 인스턴스를 생성하는 비용이나 시간이 크지 않을 때 사용한다.
public class Singleton {
private static final Singleton instance = new Singleton(); //레퍼런스 변수 선언과 동시에 인스턴스 생성
private Singleton() {} //생성자 지정으로 다른 클래스에서 객체 생성을 막음
public static Singleton getInstance() { //getInstance로 전역적인 접촉점 제공
return instance;
}
}
그 외 Static block initialization, The solution of Bill pugh, Enum way등이 있지만 다루지 않는다.