시스템 내에서 사용 할 인스턴스를 하나만 제공할 수 있도록 하는 생성패턴
시스템 런타임, 환경 세팅에 대한 정보등 인스턴스가 여러개가 있어서는 안되는 경우가 있다.
public class Single {
private Single() {}; // 접근제어자를 통해 외부에서 생성자 접근 못하도록 한다.
}
public class Single {
private Single() {};
// 외부에서 인스턴스에 접근 가능한 메소드 제공
public static Single getInstance() {
return new Single();
}
}
public class Single {
private static Single instance;
private Single() {};
public static Single getInstance() {
if(instance == null) {
instance = new Single();
}
return instance;
}
}
public class Single {
private static Single instance;
private Single() {};
public static synchronized Single getInstance() {
if(instance == null) {
instance = new Single();
}
return instance;
}
}
4.2 클래스 로딩 시점에 인스터를 생성해 사용한다.
public class Single {
private static final Single INSTANCE = new Single();
private Single() {};
public static Single getInstance() {
return INSTANCE;
}
}
4.3 double checked locking 을 통해 synchronized 비용을 최소화한다.
public class Single {
private static volatile Single instance;
private Single() {};
public static Single getInstance() {
if(instance == null) {
synchronized (Settings.class) {
if(instance == null) {
instance = new Single();
}
}
}
return instance;
}
}
4.4 static inner 클래스 활용
public class Single {
private Single() {};
private static class SingleHolder() {
private static final Single INSTANCE = new Single();
}
public static Single getInstance() {
return SingleHolder.INSTANCE;
}
}
Single single = Single.getInstance();
Constructor<Single> declaredConstructor = Single.class.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
Single reflectedSingle = declaredConstructor.newInstance();
System.out.println(single == reflectedSingle); // 결과 : false
정보 감사합니다.