STUDY/CS

[디자인 패턴] 싱글톤 패턴 (Singleton Pattern) / 자바스크립트

ez1n 2023. 1. 7. 18:09

싱글톤 패턴 (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

 

장점

  1. 인스턴스를 한 번만 생성하므로 메모리 공간이 절약됨
  2. 전역에서 클래스 접근이 가능하여 데이터 공유가 쉬움

단점

  1. 너무 많은 책임을 가지거나 많은 데이터를 공유하는 경우 시스템 결합이 높아져 유지보수가 어려워짐
  2. 테스트가 까다로움
    • 각 테스트마다 독립적인 인스턴스 만들기 어려움
    • 테스트 실행에 순서가 생기면 작은 수정사항이 전체 테스트 실패로 이어질 수 있음