"클래스가 인스턴스를 하나만 갖게 하고 전역 범위에서 이 인스턴스에 접근하는 단일 지점을 제공하기 위해 사용한다" - Gof
package me.hsnam.designpatterns.singleton;
public class AppConfig {
private static AppConfig instance; //
private AppConfig() {} // 생성자를 private로 만들어 외부에서 인스턴스를 만들 수 없도록 한다.
public static AppConfig getInstance() {
if (instance == null) {
instance = new AppConfig();
}
return instance;
}
}
package me.hsnam.designpatterns.singleton;
public class AppConfig {
private static AppConfig instance;
private AppConfig() {}
public static synchronized AppConfig getInstance() {
// 동시에 한 스레드만 들어 올수 있도록 동기화 한다.
// 동기화 작업때문에 성능에 문제가 될 수 도 있다.
if (instance == null) {
instance = new AppConfig();
}
return instance;
}
}
package me.hsnam.designpatterns.singleton;
public class AppConfig {
private static final AppConfig INSTANCE = new AppConfig();
private AppConfig() {}
public static AppConfig getInstance() {
return INSTANCE;
}
}
package me.hsnam.designpatterns.singleton;
public class AppConfig {
private static AppConfig instance;
private AppConfig() {}
public static AppConfig getInstance() {
if (instance == null) {
synchronized (AppConfig.class) {
if (instance == null) {
instance = new AppConfig();
}
}
}
return instance;
}
}
package me.hsnam.designpatterns.singleton;
public class AppConfig {
private AppConfig() {}
private static class AppConfigHolder {
private static final AppConfig INSTANCE = new AppConfig();
}
public static AppConfig getInstance() {
return AppConfigHolder.INSTANCE;
}
}
package me.hsnam.designpatterns.singleton;
public enum AppConfig {
INSTANCE;
public static AppConfig getInstance() {
return INSTANCE;
}
}
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
AppConfig appConfig1 = AppConfig.getInstance();
Constructor<AppConfig> configConstructor = AppConfig.class.getDeclaredConstructor();
configConstructor.setAccessible(true);
AppConfig appConfig2 = configConstructor.newInstance();
System.out.println(appConfig1 == appConfig2);
}