Chapter 05 Singleton 인스턴스를 한 개만 만들기 - brodieroy/Study GitHub Wiki
1. 무작정 소스를 다운받아서 봅시다. Sample 외 무지 많습니다.
2. Sample을 봅시다.
Singleton.java
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("인스턴스를 생성했습니다.");
}
public static Singleton getInstance() {
return singleton;
}
}
Main.java
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.");
}
}
Singleton pattern의 클래스 다이어그램을 봅시다.
다음의 패턴은 인스턴스가 하나인경우가 많습니다.
- Abstract Factory 패턴(Chapter08)
- Builder 패턴(Chapter07)
- Facede 패턴(Chapter15)
- Prototype 패턴(Chapter06)
연습문제
Question 1. TicketMaker클래스를 Singleton으로 만들어보자
TicketMaker.java
public class TicketMaker {
private int ticket = 1000;
public int getNextTicketNumber() {
return ticket++;
}
}
Answer 1.
TicketMaker.java
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++;
}
}
Question2. 인스턴스의 수가 3개로 한정되어있는 Triple를 만드세요.
Triple.java
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 + "]";
}
}
Main.java
public class Main {
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.");
}
}
Question3. below source? ...?
public class Singleton {
private static Singleton singleton = null;
private Singleton() {
System.out.println("This is Singleton Default constructor");
}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
Answer3.
package Singleton.A3_2;
public class Singleton {
private static Singleton singleton = null;
private Singleton() {
System.out.println("~~");
slowdown();
}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
private void slowdown() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}