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의 클래스 다이어그램을 봅시다.

UML 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) {      
        }                                       
    }                                           
}