싱글톤 패턴 (Singleton Pattern)
전체 시스템에서 클래스에 대해 오직 하나의 인스턴스만 가지도록 하는 객체 생성 패턴
- 하나의 객체를 생성하면 생성된 객체를 어디서든 참조 가능
- 인스턴스에 집적적인 접근 차단
예제 1 : 즉시 실행 함수 (IIFE) + 클로저 (Closure)
즉시 실행 함수 : 함수를 정의하자마자 바로 호출되는 함수 (초기화코드, 라이브러리 내 전역 변수의 충돌방지 등에 사용)
let Singleton = (function () {
let instance; // instance 비공개 변수
function init() { // 비공개 메서드
return {
publicMethod: function () { // public 메서드
return {name: 'yejin', age: 26}
}
};
}
// public 메서드인 getInstance 를 정의한 객체
// 이 메서드를 통해 비공개된 메서드와 변수에 접근 가능 (closure)
return {
getInstance: function () {
if (!instance) instance = init();
return instance;
}
}
})();
let a = Singleton.getInstance();
let b = Singleton.getInstance();
console.log(a === b); // true
- IIFE를 이용하여 인스턴스를 감춘다.
- 클로저를 이용해야만 인스턴스에 접근 가능
예제 2 : Class 이용 - ES7
ES7 이상부터 static 프로퍼티 사용 가능
class Singleton {
static instance;
constructor() {
if (Singleton.instance) return Singleton.instance;
this.name = 'yejin';
this.age = 26;
Singleton.instance = this;
}
}
let a = new Singleton();
let b = new Singleton();
console.log(a === b); // true
장점
- 인스턴스를 한 번만 생성하므로 메모리 공간이 절약됨
- 전역에서 클래스 접근이 가능하여 데이터 공유가 쉬움
단점
- 너무 많은 책임을 가지거나 많은 데이터를 공유하는 경우 시스템 결합이 높아져 유지보수가 어려워짐
- 테스트가 까다로움
- 각 테스트마다 독립적인 인스턴스 만들기 어려움
- 테스트 실행에 순서가 생기면 작은 수정사항이 전체 테스트 실패로 이어질 수 있음
'STUDY > CS' 카테고리의 다른 글
[네트워크] TCP/IP 4계층 (0) | 2023.01.21 |
---|---|
[네트워크] 네트워크 토폴로지 (Network Topology) / 네트워크 분류 (2) | 2023.01.20 |
[디자인 패턴] 옵서버 패턴 (Observer Pattern) / 자바스크립트, 프록시 객체 (2) | 2023.01.10 |
[디자인 패턴] 전략 패턴 (Strategy Pattern) / 자바스크립트 (0) | 2023.01.09 |
[디자인 패턴] 팩토리 패턴 (Factory Pattern) - 팩토리 메소드, 추상 팩토리 / 자바스크립트 (0) | 2023.01.08 |