어떤 클래스에 대해 오직 하나의 인스턴스만 생성하고, 이 인스턴스에 대한 전역적인 접근이 필요할 때, 또는 인스턴스가 여러 개 생성되면 예기치 않은 문제가 발생하는 경우 사용합니다.
예를 들어, 다음과 같은 상황에서 싱글톤 패턴을 사용할 수 있습니다.
장점
단점
단위 테스트를 구현하기 어렵습니다.
싱글톤 패턴은 전역적인 접근점을 제공하기 때문에, 객체간의 결합도가 높아지는 문제가 발생합니다.
싱글톤 패턴을 구현하기 위해서는 코드 자체가 많이 필요합니다. 따라서 코드가 복잡해질 수 있습니다.
싱글톤 패턴은 다중 스레드 환경에서는 안정성 문제가 발생할 수 있습니다. 따라서, Thread Safe한 구현방법이 필요합니다.
싱글톤 패턴에서는 오직 하나의 인스턴스만 생성되도록 보장하는데, 다중 스레드 환경에서 동시에 접근하면서 인스턴스 생성을 시도할 경우, 둘 이상의 스레드에서 동시에 인스턴스를 생성하는 문제가 발생할 수 있습니다. 이러한 경우, 둘 이상의 인스턴스가 생성될 가능성이 있으며, 이는 싱글톤 패턴의 목적과는 상반되는 결과를 가져올 수 있습니다.
예를 들어, 스레드 A와 스레드 B가 동시에 인스턴스를 생성하려는 경우, 둘 다 아직 인스턴스가 생성되지 않았다고 판단하고 새로운 인스턴스를 생성할 수 있습니다. 따라서, 다중 스레드 환경에서 싱글톤 패턴을 사용할 경우, 인스턴스 생성 시점에 대한 동기화 처리가 필요합니다.
getInstance
메서드를 구현하여 인스턴스를 반환합니다.public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println("singleton1 = " + singleton1);
System.out.println("singleton2 = " + singleton2);
System.out.println("Are the two instances the same object? "
+ (singleton1 == singleton2));
}
}