getBean : 객체 반환 시 동일한 객체 반환 ( 주소가 같은 동일한 객체 )
일반 객체 생성 : 매번 새로운 객체를 반환
public class UserDao {
private ConnectionMaker connectionMaker;
// INSTANCE : 싱글톤 오브젝트로 UserDao 객체를 받아줌.
private static UserDao INSTANCE;
//생성자를 private로 만듦.
private UserDao(ConnectionMaker connectionMaker) {
this.connectionMaker = connectionMaker;
}
// getInstance()로 싱글톤 오브젝트를 반환할 수 있도록 함.
public static synchronized UserDao getInstance(){
if(INSTANCE==null){
INSTANCE = new UserDao(new DConnectionMaker());
}
return INSTANCE;
}
}
생성자가 private이므로 상속을 할 수 없다.
→ 객체 지향 프로그래밍의 장점임 상속과 다형성을 적용할 수 없다.
테스트하기 어렵다.
→ 동적으로 오브젝트를 주입할 수 없으니, 필요한 오브젝트를 직접 만들어야 한다.
서버 환경에서 싱글톤이 하나만 만들어지는 것을 보장하지 않는다.
→ 싱글톤 기법이 서버 환경에서 보장되지 않는다.
→ JVM에 분산되서 설치되면, 오브젝트가 여러 개 생기니 싱글톤 가치가 떨어진다.
싱글톤을 사용하는 것은 전역 상태를 갖기에 바람직하지 않다.
→ 싱글톤은 static 팩토리 메소드를 통해서 자유롭게 객체에 접근할 수 있으므로 전역 상태를 갖기 쉽다.