[디자인패턴] 싱글톤 패턴 - JS

REASON·2022년 10월 19일
0

CS

목록 보기
5/7

싱글톤 패턴이란,

실제로 생성되는 객체(인스턴스)가 1개인 클래스를 의미하며
생성자가 여러번 호출되어도 인스턴스는 하나여야 한다.
즉, 인스턴스가 처음 생성된 이후부턴 이미 생성된 인스턴스를 반환하기 때문에
단 하나의 인스턴스가 보장되는 디자인패턴이다.

싱글톤 패턴 구현하기

자바스크립트에서 객체 리터럴을 사용하는 것도 싱글톤 패턴이다.

const sington = {
  a : 1,
  b : 2,
};

const sington2 = {
  a : 1,
  b : 2,
};

비공개 멤버 변수, 메서드를 정의해서 구현하기

함수로 구현할 경우 IIFE (즉시 실행 함수)로 구현해서 클로저를 형성해주어야 한다.

const Singleton = (function () {
  let instance = null;

  function privateMethod() {
    return {
      publicProperty: "공개 프로퍼티",
      publicMethod() {
        console.log("공개 메서드");
      }
    };
  }
  
  return {
    getInstance() {
      if (instance) return instance;
      instance = privateMethod();
      return instance;
    }
  };
})();

const test = Singleton.getInstance();
const test2 = Singleton.getInstance();
console.log(test === test2); // true

즉시 실행 함수로인해 Singleton이 getInstance()를 리턴할 것이다.
현재 instance값이 falsy하지 않다면(인스턴스가 생성되지 않은 경우) privateMethod를 호출하고
호출한 privateMethod는 publicProperty, publicMethod를 리턴하게 된다.
결국 test와 test2는 해당 프로퍼티와 메서드를 갖게 되는 것이다.
여기서 중요한 점은 test와 test2가 같은 인스턴스라는 것인데,
getInstance가 instance가 이미 있는 경우 이미 만들어진 instance를 반환하기 때문이다.

클래스로 구현하기

private 프로퍼티를 사용한 Singleton 패턴이다. (ES2019)

class Singleton {
    static #instance = null;
    constructor(){
        if(Singleton.#instance) return Singleton.#instance;
        Singleton.#instance = this;
    }
}

const test = new Singleton();
const test2 = new Singleton();

console.log(test === test2); // true

생성자 함수가 현재 인스턴스가 있으면 이미 만들어진 인스턴스를 반환하고 그렇지 않으면 인스턴스를 만드는 코드이다.

클래스랑 친해지고 싶어서 클래스로도 구현해보려고 했는데
클래스는 아무리 봐도 정이 안간다......ㅜㅜ

참고 자료
위키백과 싱글턴 패턴
싱글톤 패턴

0개의 댓글