싱글턴 패턴(Singleton)
- 생성 패턴
- 전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하면, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
구현
Lazy initialiaztion
public class SingleTon {
private SingleTon() {
}
private static SingleTon singleTon;
public static SingleTon getInstance() {
if (singleTon == null) {
singleTon = new SingleTon();
}
return singleTon;
}
}
Thread safe initialization
public class SynchronizedSingleTon {
private SynchronizedSingleTon(){
}
private static SynchronizedSingleTon instance;
public static synchronized SynchronizedSingleTon getInstance() {
if (instance == null) {
instance = getInstance();
}
return instance;
}
}
Double-Checked Locking
public class VolatileSingleTon {
private static volatile VolatileSingleTon instance;
private VolatileSingleTon() {
}
public static VolatileSingleTon getInstance() {
if (instance == null) {
synchronized (VolatileSingleTon.class) {
if (instance == null) {
instance = new VolatileSingleTon();
}
}
}
return instance;
}
}
LazyHolder
public class HolderSingleTon {
private HolderSingleTon() {
}
private static class SingleTonInstanceHolder {
private static final HolderSingleTon INSTANCE = new HolderSingleTon();
}
public static HolderSingleTon getInstance() {
return SingleTonInstanceHolder.INSTANCE;
}
}
싱글톤 패턴 사용 이유
- 메모리
- 최초 1번의 new 연산자를 통해 고정된 메모리 영역 사용
- 해당 객체 접근 시 메모리 낭비 방지
- 데이터 공유
- 전역으로 사용되는 인스턴스이므로 다른 클래스의 인스턴스들 접근 가능
- 인스턴스가 한 개가 존재하는 것을 보증
싱글톤 패턴 문제점
- 테스트 어려움
- 싱글톤 인스턴스는 자원을 공유
- 테스트 격리를 위해서 매번 인스턴스 상태 초기화 필요
- SOLID 원칙을 위반할 가능성이 높다
- 인스턴스 자체가 하나만 생성해 여러 책임을 지는 경우가 많다(SRP)
- 많은 데이터를 공유 시 클래스 간 결합도 증가(OCP)
- 구체 클래스에 의존(DIP)
참조
싱글톤(Singleton) 패턴이란?
싱글톤(Singleton) 패턴 - 꼼꼼하게 알아보자