클래스의 인스턴스가 단 하나만 필요한 경우 사용하는 패턴.
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;
}
}
static 메소드를 통해 항상 처음 만들어진 같은 객체를 반환할 수 있도록 한다.
Singleton의 역할 : Singleton 역할은 유일한 인스턴스를 얻기 위한 static 메소드를 가지고, 이를 통해 항상 같은 객체를 반환한다.
public class Main {
public static void main(String[] args) {
MultiThread AAA = new MultiThread("AAA");
MultiThread BBB = new MultiThread("BBB");
AAA.start();
BBB.start();
}
}
public class MultiThread extends Thread{
private String name;
public MultiThread(String name) {
this.name = name;
}
public void run() {
int count = 0;
for(int i=0; i<5; i++) {
count++;
Singleton singleton = Singleton.getInstance();
System.out.println(name+ "의"+ count+"번째 쓰레드의 singleton 객체 : " + singleton.toString());
try {
Thread.sleep(400);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public class Singleton {
private Singleton() {}
private static Singleton single = null;
public static /*synchronized*/ Singleton getInstance() {
if(single == null) {
System.out.println("싱글톤 생성...");
single = new Singleton();
}
return single;
}
}
이 경우, 초반에 여러개의 싱글톤 객체가 생성될 수 있다. 따라서 synchronized를 통해 싱글톤 생성을 한번으로 막을 필요가 있다.
싱글톤이 상태를 갖지않고 global access를 제공한다면 Static Class를 고려해볼만 하다.
참조 : https://thisisnew-storage.tistory.com/9
Java 언어로 배우는 디자인 패턴 입문