티스토리 뷰
본 내용은 "박은종의 객체지향 설계를 위한 디자인패턴 with 자바" 강의를 듣고 나름대로 정리한 내용이다.
Singleton 패턴
클래스에 대한 인스턴스가 단 하나만 존재하며, 해당 인스턴스에 접근할 수 있도록 제공하는 패턴
Singleton 패턴 적용 가능한 상황
- 인스턴스가 여러 개일 경우에 문제가 발생할 수 있는 것은 인스턴스를 하나만 생성하여 공유할 수 있도록 함.
- 각기 다른 값을 가질 필요가 없을 때
( Ex. new A("james"), new A("albert") 등 property 값이 여러개일 필요가 없을 때 )
- 개수가 정해져 있는 경우
( Ex. db connection pool ... )
Singleton 패턴 특징
- 유일하게 존재하는 인스턴스로, 접근을 통제할 수 있다.
Singleton의 클래스 다이어그램
SingleThread 일 때,
public void main(String[] args){
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance1 == instance2); //가져온 두 객체가 같은지 확인
}
...
//Singleton 패턴
public class Singleton{
private static Singleton instance;
//외부에서 new 를 통한 객체를 생성하지 못하게 해야 하므로 construct는 "private" 로 선언
private Singleton(){}
//외부에서 new 를 통해 생성되지 않고 해당 instance 객체에 접근해야 하므로 "static" 이어야 함
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance; //생성되어 있는 객체 반환
}
}
위에 있는 Singleton 생성 코드는 Multi Thread 환경에서는 정상동작 하지 않을 수 있다. 하나의 thread에서 instance를 생성하는 중에 다른 thread에서 instance를 호출한다면 아직 instance 생성이 완료되지 않았기 때문에 또 하나의 instance를 생성할 수 있기 때문이다.
Multi Thread 환경일 때,
static 은 클래스가 loading 될 때, 한 번 실행되며, thread-safe 하다. 따라서, 멀티 스레드 환경에서 singleton을 구현할 때 static을 이용하여 객체를 생성한다. 또한, LazyHolder를 이용하여, instance를 사용하는 시점에서 instance가 생성되게 하면, 사용하지 않을 수도 있는 환경에서 미리 instance 객체를 만들어 메모리를 잡아 먹지 않아도 된다.
'DesignPattern' 카테고리의 다른 글
[ Design Pattern ] Decorator Pattern (0) | 2022.03.17 |
---|---|
[ Design Pattern ] Template Method Pattern (0) | 2022.03.11 |
[Design Pattern] Strategy Pattern (0) | 2022.03.11 |
[Design Pattern] Chain of Responsibility pattern (0) | 2022.03.09 |
[디자인패턴-java] 디자인 패턴을 배우는 이유 (0) | 2021.12.12 |