synchronized
키워드를 통해 동기화를 시켜줘야한다.public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static synchroinzed Singleton getInstance() {
if (singleton == null) {
this.singleton = new Singleton();
}
return this.singleton;
}
}
static final
키워드를 통해 불변 객체를 보장한다.public class Singleton {
public static final Singleton singleton = new Singleton();
private Singleton() {};
...
}
단일 책임 원칙
: 구현과 사용 책임이 하나의 클래스에 몰려있다. 엄밀히 따지면 단일 책임 원칙을 위배하고 있다.개방 폐쇄 원칙
: 클래스 내부에서 객체를 직접 생성하고 사용하고 있다. 싱글톤 기능의 확장으로 다른 객체를 사용할 경우 코드가 변경되어야하므로 개방 폐쇄 원칙도 위배된다. 의존성 역전 원칙
: 추상화에 의존하지 않고 직접 구현체와 결합하고 있으므로 의존성 역전 원칙도 따르지 않고 있다.싱글톤 패턴은 애플리케이션 실행 중 인스턴스를 한 개만 생성하고 싶을 때 사용하는 디자인 패턴이다. 싱글톤 패턴은 장단점이 명확히 구분되기도 하지만, 프레임워크 도움없이 사용하게 될 경우 단점 때문에 오히려 안티패턴으로 간주되기도 한다. SOLID 관점에서 보더라도 여러 원칙들을 위배하기 때문에 객체지향스럽지 못한 패턴이기도 한다.
스프링 같은 프레임워크의 도움을 받는다면, 객체를 직접 생성할 필요없이 프레임워크가 단점을 커버해주는 부분이 많으므로 싱글톤 패턴의 장점을 누릴 수 있다. 그래서 스프링이 관리하는 빈들은 기본 스코프가 싱글톤으로 되어있다.
싱글톤 패턴 역시 자주 만나게 되는 디자인 패턴이다. 장단점을 명확히 알고 상황에 맞게 사용한다면 유용한 디자인 패턴이 될 수 있을 것이라고 생각한다.