반응형
Singleton Pattern
프로세스 실행 중에 오직 하나의 객체만 생성되도록 강제하는 디자인 패턴.
싱글톤이 적용된 클래스의 객체를 여러개 생성해도 모두 하나의 객체만을 가리키게 된다.
결국, 해당 객체는 단 하나만 만들어지게 되는 것.
# 싱글톤 클래스 정의
싱글톤 클래스는 static 변수(instance)가 존재한다.
싱글톤 클래스에서 내부 static 변수가 정의되어 있지 않다면,
static 변수에 현재 객체(this)를 할당해주고, 이 변수를 return해준다.
class Singleton{
static instance;
if(!Singleton.instance){
Singleton.instance = this;
}
return Singleton.instance;
}
이제 클라이언트 코드에서 여러 싱글톤 객체를 만들어 주고 비교해보면,
두 객체는 동일한 것을 확인할 수 있다.
let s1 = new Singleton();
let s2 = new Singleton();
if(s1 === s2){
console.log("same"); // 출력됨.
}else{
console.log("diff");
}
프로세스가 실생되면,
프로세스의 실행부터 종료까지 유지되는 정적(static) 인스턴스가 생성되며, 이 인스턴스는 undefined, 즉 아무것도 가리키지 않는다.
클라이언트 동작에 따라 s1 객체가 선언되며 생성자(constructor)가 호출되면 static 인스턴스는 Singleton 객체를 가리키게 된다.
다음으로 s2 객체가 선언될 때는, static 인스턴스가 이미 값을 가지고 있으므로 바로 그 값을 반환한다. 여기서 값이란 s1때 생성된 Singleton 객체이다.
결론적으로, s1과 s2는 같은 객체를 가리키기 때문에 둘은 싱글톤이다(같다)라고 표현할 수 있다.
이후로 아무리 Singleton 객체를 생성해도, 모두 같은 객체를 가리키게 된다.
예제
class SingleCat {
static instance;
constructor(name) {
this.name = name;
if (!SingleCat.instance) {
SingleCat.instance = this;
}
return SingleCat.instance;
}
speak() {
console.log(this.name, 'meow!');
}
}
let cat1 = new SingleCat('Nabi');
let cat2 = new SingleCat('Kitty');
if (cat1 === cat2)
console.log("same cat!"); // 출력됨.
else
console.log("different cat!");
cat1.speak(); // Nabi meow!
cat2.speak(); // Nabi meow!
# 싱글톤 패턴이 사용되는 경우
- 하나의 객체가 많은 리소스를 차지할 때.
- 객체가 외부 네트워크와 연결되는데 이 네트워크가 동시에 단 하나만 연결되어야 할 때.
# 참조 링크
Youtube link
Factory Design pattern
반응형
'Dev > Design Patterns' 카테고리의 다른 글
[Design Pattern] Factory - 팩토리 디자인 패턴 (2) | 2021.11.20 |
---|