Design Pattern
2009. 5. 6. 12:28
-지정한 클래?스의 인스턴스가 '절대로' 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 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.");
}
}