April 19, 2022
객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.
public class MySingleton {
private static MySingleton theObject;
private MySingleton() {
}
public static MySingleton createMySingleton() {
if (theObject == null)
theObject = new MySingleton();
return theObject;
}
}
위의 예제는 맨처음에 보여준 UML과 구조가 거의 같다. 결국 모든 클래스에서 공유할 수 있고, 객체의 생성없이 사용할 수 있도록 static으로 singleton object와 getter를 구현했다. createMySingleton
메서드에서 볼 수 있듯이 먼저 현재의 인스턴스가 null인지 확인하고, null이라면 instanciation을 해주고 아니라면 생성한 instance를 리턴한다.
public class SingleObject {
private static SingleObject instance = new SingleObject();
private SingleObject(){}
public static SingleObject getInstance(){
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
또한 바로 위의 예제와는 다르게 객체에 바로 new 로 실행해주고 getInstance() method가 실행되면 바로 return 하도록 만들어줄 수 있다.
티케팅을 할 때 의 예제도 싱글톤으로 구현할 수 있다.
TicketMaker
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() {
return ticket++;
}
}
public class TicketMain {
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.");
}
}
위의 TickerMaker는 Singleton으로 관리되기 때문에 ticket을 저장한 것은 객체는 하나로 볼 수 있다.
싱글톤을 이용하여 생성한 객체의 수를 제한해줄 수도 있다.
public class Triple {
private static Triple[] triple = new Triple[]{
new Triple(0),
new Triple(1),
new Triple(2),
};
private int id;
private Triple(int id) {
System.out.println("The instance " + id + " is created.");
this.id = id;
}
public static Triple getInstance(int id) {
return triple[id];
}
public String toString() {
return "[Triple id=" + id + "]";
}
}
public class TripleMain {
public static void main(String[] args) {
System.out.println("Start.");
for (int i = 0; i < 9; i++) {
Triple triple = Triple.getInstance(i % 3);
System.out.println(i + ":" + triple);
}
System.out.println("End.");
}
}
위의 처럼 static 배열을 사용하여 결국 객체의 수는 3개로 제한한다.