싱글톤 패턴(singleton)은 전체 시스템에서 클래스의 인스턴스를 하나만 존재하도록 하는 패턴이다. 보통 객체를 만들 때 하나의 생성자로 여러 개의 서로 다른 객체를 만들 수 있다. 그러나 싱글톤에서는 단 하나의 객체만 존재하는 것이 보장된다.
가장 간단한 싱글톤 예제는 아래와 같이 객체 리터럴을 이용하는 것이다.
const plus = {a: 1, b: 2};
const minus = {a: 1, b: 2};
동일한 키와 값을 똑같이 지정했더라도 참조하는 주소값이 다르기 때문에
plus와 minus는 각각 유일하게 존재하는 서로 다른 객체이다.
그렇지만 이렇게 객체 리터럴로 사용하지 않고 비공개된 프로퍼티나 함수를 정의하고 싶다면? 비공개 프로퍼티와 함수를 정의하려면 클로저(closure)를 사용해야 한다. 아래처럼 IIFE(즉시 실행 함수)로 비공개 변수를 가질 수 있게 만들어주면 된다.
const SingletonClass = (function() {
let instance;
function init(){ // 싱글톤 객체를 리턴할 비공개 함수
return {
publictMethod: function() {
return 'public method';
},
publicProp: 'public variable',
};
}
return {
getInstance: function() {
if (instance) {
return instance; // 있으면 그냥 반환
}
instance = init();
return instance; // 없으면 객체 생성 후 반환 (이해를 위해 명시적으로 나눔)
}
};
})();
const a = SingletonClass.getInstance();
console.log(a.publicProp, 'a'); // 'public variable'
const b = SingletonClass.getInstance();
console.log(a === b) // true
비공개 함수 init()의 return문에서 객체 리터럴로 정의되는 인스턴스가 싱글톤 객체이다. SingletonClass 내부에 있는 getInstance 메서드는 생성된 인스턴스가 있으면 이미 생성된 객체를 리턴하고, 아니라면 객체를 생성해서 리턴한다. 즉 객체를 여러번 생성하더라도 각자 다른 객체가 아니라 한 개의 동일한 객체를 가리키게 되는 것이다.
싱글톤 패턴에서는 이미 객체가 생성되었는지 여부를 판단하는 instance와 같은 내부 변수가 필요하다. 클로저를 통해 getInstance 메서드가 호출되는 시점에 instance의 값에 접근할 수 있고, getInstance의 호출이 끝나더라도 변경된 instance의 값은 유지된다.
참고:
자바스크립트 싱글톤 패턴
(https://velog.io/@recordboy/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4)
싱글톤 패턴
(https://webclub.tistory.com/150)