디자인 패턴이란? Software development 에서 반복적으로 발생하는 공통의 issue를 해결하기 위해 연구된, 특정 문제해결을 위한 전형적인 방법.
‘이러이러한 문제 상황’에서는 ‘이 방법으로 해결하는 게 좋더라’ - 일종의 축적된 Solution.
디자인 패턴 이용의 장점
디자인 패턴의 종류 : Singleton, Decorator, Observer, Strategy… 등 수십개 존재함.
이 중 Singleton Pattern 은 creational design patterns 카테고리에 속함.
Instance가 메모리상에 오직 1개만 생성되도록 설계하는 것.
class Car { // 클래스
int number;
String kind;
public Car(int number, String kind) {
...
}
}
public class Test {
public static void main(String[] args) {
Car car; // 객체 선언
car = new Car(1, "Avante"); // 인스턴스 - 실제 메모리에 할당
}
}
public class Singleton {
private static Singleton instance; // 최초 instance는 null
private Singleton() { // private 생성자로 new 인스턴스 생성을 막는다
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton(); // 메소드 최초 실행 시 인스턴스 초기화
}
return instance;
}
}
public class Practice {
public static void main(String[] args) {
/* 싱글톤 인스턴스 생성 */
Singleton singleton1 = new Singleton(); // inaccessible
Singleton singleton2 = Singleton.getInstance(); // accessible
Singleton singleton3 = Singleton.getInstance(); // accessible
/* 주소값 출력 */
System.out.println(singleton2);
System.out.println(singleton3);
}
}
/* 출력 주소값 */
Singleton@10f87f48
Singleton@10f87f48
만약 여러 스레드가 이 객체가 생성되기 전에 동시에 접근한다면 경합 조건(Race Condition)이 발생할 수 있다.
객체를 만들기전에 스레드가 동시에 접근하면 객체를 여러개 만들게되는 상황에 직면할 수 있다.
public class Singleton {
private static Singleton instance; // 최초 instance는 null
private Singleton() {
}
public static synchronized Singleton getInstance() { // synchronized
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class Singleton {
public static Singleton instance = new Singleton(); // 클래스 로딩 시점에서 인스턴스 생성
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}