디자인 패턴 - 싱글톤 패턴 (singleton pattern)
1. 싱글톤 패턴이란?
싱글톤 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고 ,어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴
2. 기본적인 패턴 구현법 (자바)
public class Singleton{
private static Singleton uniqueInstance; → Singleton 클래스의 유일한 인스턴스를 저장하기위한 정적변수
// 기타 인스턴스 변수
private Singleton () {} → 생성자가 private ,Singleton에서만 클래스의 인스턴스를 만듦
public static Singleton synchronized getInstance(){
if(uniqueInstance == null ){ → *게으른 인스턴스 생성 (lazy instantiation)
uniqueInstance = new Singleton(); 인스턴스가 필요한 상황이 닥치기 전에는 아예 인스턴스를 생성하지 않는다
}
return uniqueInstance;
}
//기타 메소드
}
*synchronized
한 스레드가 메소드 사용을 끝내기 전까지 다른 스레드는 기다린다 (멀티 스레딩 문제 해결 방법 )
3. 더 효율적인 방법이 없을까요???
public class Singleton{
private static Singleton uniqueInstance = new Singleton(); → 인스턴스를 필요할 때 생성하지 말고 , 처음부터 만들어 버린다.
// 기타 인스턴스 변수
private Singleton () {}
public static Singleton getInstance(){. → synchronized 는 사용하지않는다. 성능 100배 저하 !!
return uniqueInstance;
}
//기타 메소드
}
3. 쓰임새의 예시
- 사용자설정,레지스트리설정을 처리하는 객체
- DBCP (DataBase Connection Pool), Thread Pool, 캐시, 대화상자,로그 기록 객체 등
- 프린터나 그래픽 카드같은 디바이스를 위한 디바이스 드라이버 등
4. 사용하는 이유
- 메모리 낭비를 방지
- 다른 클래스의 인스턴스들이 데이터를 공유하기 쉬움
- 공통된 객체를 여러 개 생성해서 사용할 때 ex) DBCP
- 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우
5. 단점
- 너무 많은 일과 많은 데이터 공유를 하면 다른 클래스들간의 결합도가 높아져 개방-폐쇄 원칙(open-closed principle)에 위배 된다.