장점 : 한 번의 new로 인스턴스를 사용하기 때문에 고정된 자원을 사용하기 때문에 자원낭비를 방지할 수 있다.
단점 : OCP 원칙을 위배하게 됨, 테스트하기 어렵다, 상속 불가능 등.. 많은 어려움이 있기 때문에 잘못 사용하면 안티 패턴이 될 수 있기 때문에 주의해서 사용해야 한다.
1.Sychronized - 가장 간단하지만 약간의 성능 저하가 있음
2.Eager Initialization(이른 초기화 방법) - 생성 객체를 미리 만들어놓고 쓰지 않으면 앱 로딩 시 많은 자원을 소모함
3.Double Checked Locking - 동기화 작업을 인스턴스가 널인 경우에만 확인하도록 해서 리소스 소모를 줄이는 방법
4.Static Inner Class - 내부 클래스를 생성해서 인스턴스를 리턴받는방법 (권장)
5.EnumClass - EnumClass로 만드는방법 (권장)
private static Settings instance;
public static synchronized Settings getInstanceSynchronized() {
if (instance == null) {
instance = new Settings();
}
return instance;
}
private static final Settings INSTANCE = new Settings();
public static Settings getInstanceEager() {
return INSTANCE;
}
private static volatile Settings instance3;
public static synchronized Settings getInstanceDoubleCheck() {
if (instance3 == null) {
synchronized (Settings.class) {
if (instance3 == null) {
instance3 = new Settings();
}
}
}
return instance3;
}
private static class SettingsHolder {
private static final Settings INSTANCE = new Settings();
}
public static Settings getInstanceInnerClass() {
return SettingsHolder.INSTANCE;
}
public enum EnumSettings {
INSTANCE;
}
ApplicationContext applicationContext =new AnnotationConfigApplicationContext(Config.class);
String hello = applicationContext.getBean("hello", Hello.class);
String hello2 = applicationContext.getBean("hello", Hello.class);
System.out.println(hello == hello2); //True 반환
출처 : 백기선님의 디자인패턴