[JS] Singleton pattern

Vorhandenheit ·2022년 9월 12일
0

JS/Node 

목록 보기
57/63

싱글톤 패턴

회사에서 구매해 준 책인 디자인 패턴 책을 구매하게되서 읽게되었습니다. 이때까지 여러 책을 읽으면서 패턴에 대해서 읽었지만 제대로 정리한 적이 없어서 할려고합니다.

1. 싱글톤 패턴

싱글톤이란 전체 시스템에서 하나의 인스턴스만 존재하도록 보장하는 객체 생성패턴입니다.

인스턴스를 하나만 생성하기 때문에, 특정 클래스에서 인스턴스를 생성할 때 처음 호출 시에는 객체를 생성하지만 두 번째부터는 생성한 객체를 반환합니다.

(1) 클로저

let Animal = () => {
	const animal = this;
  	Animal = () => {
    	return animal
    }
}

위 방법은 처음 호출되었을 때 animal = this라는 클로저를 선언합니다. 두 번째 호출되었을시 클로저 함수를 반환합니다.

(2) 즉시 실행 함수

const Animal = (() => {
	return {
    	run() {
        }
    }
})()

Animal 함수는 run 메소드를 가지는 객체를 반환하여 할당합니다.

let singleTon = function() {
  	let instance; // 비공개 변수 정의
  
  function secret() { // 비공개 메서드 정의
  	if (instance) {
    	return instance;
    }
    instance = this;
    //Singleton initialization code
  }
  singleTon.getInstance = function() {
  	return instance || new Singleton()
  }
  return singleTon;
}());

let first = singleTon.getInstance();
let second = singleTon.getInstance();

(3) 내부 클래스

const Animal = (()=>{
    let instance = null;
    const InnerClass = function () {
        
    }

    InnerClass.prototype.run = function () { };

    let privateMember1 = function () { };

    return {
        getInstance () {
            if (instance === null) {
                instance = new InnerClass();
            }
            return instance;
        }
    };
})();

const o1 = Animal.getInstance();
const o2 = Animal.getInstance();

(4) class

class singleTon {
  constructor() {
  	if (instance) {
    	return instance;
      instance = this;
    }
  }
}
  const bar = new singleTon();
  const qaz = new singleTon()

=> 정적 필드 기능 추가

class singleTon {
	static instance
  constructor() {
  	if (instance) return instance;
    instance = this
  }
}

const first = new singleTon();
const second = new singleTon();

2. 필요성

싱글톤 패턴을 찾다보니, 싱글톤 패턴은 node.js에서 필요없다는 말이 있었습니다.
왜냐하면 node.js 에서는 require한 모듈은 require.cache에 저장되어 매번 새로운 인스턴가 생성되는게 아니라 캐싱된 객체 인스턴스를 재사용하기 떄문입니다.

그래서 싱글톤 패턴으로 작성할 경우, 코드가 더 복잡해 질 수 있습니다.


하지만 코드 디자인 측면에서 장점이 있다면 사용하는게 좋습니다. (메모리 효율이 않좋더라도)

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글