핵심 의도

싱글턴 패턴은 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공한다.

적용 상황

프로그램이 실행될 때 인스턴스를 하나만 만드는 것이 더 안전하거나 경제적인 경우 사용한다. 예를 들어 스레드 풀이나 커넥션 풀, 캐시, 대화상자, 설정, 로그, 디바이스 드라이버 등이 있다. 또한 하나만 존재해야하는 객체의 생성 비용이 큰 경우 지연생성 방식으로 필요할 때 인스턴스를 생성하는 상황에 적합하다.

솔루션의 구조와 각 요소의 역할

Untitled

객체에게 책임을 분할하기

객체는 원래 맡은 책임과 함께 자신이 하나만 존재하도록 관리하고 생성하는 책임을 담당한다. 따라서 싱글톤 객체는 외부로부터 생성 요청을 받아서 자신의 인스턴스를 생성한다. 싱글톤 객체는 자신만 접근할 수 있는 private 생성자를 가지고, 외부로부터 생성 요청을 받는 public 메소드를 가진다.

구현 포인트

실행 중에 인스턴스를 하나만 존재하도록 보장하는 것이 생각보다 어렵다. 멀티스레드, 직렬화, 리플렉션 등의 변수 가능성이 있기 때문이다. 그래서 싱글톤을 구현하는 방법이 여러개다. 상황에 맞게 골라서 사용하면 된다.

방법1. private 생성자와 public 게터

public class Singleton {
    private static Singleton self = null;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if(self == null) {
            self = new Singleton();
        }
        return self;
    }

    public void say() {
        System.out.println("I am the only one..");
    }
}