Singleton 패턴

Design Pattern 2008. 11. 13. 14:43

-지정한 클래스의 인스턴스가 '절대로' 1개밖에 존재하지 않는 것을 '보증'하고 싶을 때
-인스턴스가 1개밖에 존재하지 않는 것을 프로그램 상에서 표현하고 싶을 때


밑줄을 친 것은 static이다.

싱글톤클래스에서는 인스턴스를 1개밖에 만들 수 없으며, singleton은 static필드로서 Singleton클래스의 인스턴스에서 초기화된다. 이 초기화는 Singleton클래스를 로드할 때 1회만 실행된다.
생성자는 private. 외부에서 생성자의 호출을 금지하기 위해서이다!!
인스턴스를 얻는 메소드로 getInstance가 준비되어 있다.

//싱글톤클래스
public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {                                
        System.out.println("인스턴스를 생성했습니다.");
    }
    public static Singleton getInstance() {
        return singleton;
    }
}

//테스트를 위한 메인클래스
public class Main {
    public static void main(String[] args) {
        System.out.println("Start.");
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();
        if (obj1 == obj2) {
            System.out.println("obj1과 obj2는 같은 인스턴스입니다.");
        } else {
            System.out.println("obj1과 obj2는 같은 인스턴스가 아닙니다.");
        }
        System.out.println("End.");
    }
}


다른 예제


public class TicketMaker {
    private int ticket = 1000;
    private static TicketMaker singleton = new TicketMaker(); //싱글톤객체생성   
    private TicketMaker() {     //생성자                                   
    }                                                              
    public static TicketMaker getInstance() {  //인스턴스를 얻기 위한 메소드
        return singleton;                                          
    }                                                              
    public synchronized int getNextTicketNumber() { //synchronized선언함으로 복수의 스레드에서호출되어도 올바로 작동시키기 위한 조치.사용하지않으면 복수의 스레드에 같은 값 반환 위험.
        return ticket++;
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("Start.");
        for (int i = 0; i < 10; i++) {
            System.out.println(i + ":" + TicketMaker.getInstance().getNextTicketNumber());
        }
        System.out.println("End.");
    }
}

AND