싱글톤 패턴(Singleton Pattern)은 객체 지향 프로그래밍에서 특정 클래스의 인스턴스가 오직 하나만 존재하도록 보장하는 디자인 패턴입니다. 이 패턴은 특정한 자원이나 상태를 공유해야 하는 경우에 유용하게 사용됩니다.
private
으로 설정합니다.1 ) 전역 변수를 통한 인스턴스 관리
let instance: Singleton;
export class Singleton {
count: number;
constructor(initalCount: number) {
this.count = initalCount;
if (instance) {
return instance;
}
instance = this;
}
getInstance() {
return this;
}
getCount() {
return this.count;
}
increment() {
this.count += 1;
}
decrement() {
this.count -= 1;
}
}
const singleton1 = new Singleton(0);
const singleton2 = new Singleton(10); // 기존 인스턴스 사용 count 10으로 초기화 x
const instance1 = singleton1.getInstance();
const instance2 = singleton2.getInstance();
console.log(instance1 === instance2); // true instance가 일치
singleton1.increment(); // 0 => 1
console.log(singleton1.getCount()); // 1
singleton2.decrement(); // 1 => 0 처음 설정한 sington1의 instance 바로보고 있기 때문
console.log(singleton2.getCount()); // 0 처음 설정한 sington1의 instance 바로보고 있기 때문
2 ) private 생성자와 정적 메서드를 통한 인스턴스 관리
export class Singleton {
private static instance: Singleton;
private count: number;
// private 생성자: 외부에서 직접 인스턴스를 생성하지 못하도록 함
private constructor(initialCount: number) {
this.count = initialCount;
}
// Singleton 인스턴스를 반환하는 정적 메서드
public static getInstance(initialCount: number = 0): Singleton {
if (!Singleton.instance) {
Singleton.instance = new Singleton(initialCount);
}
return Singleton.instance;
}
public getCount(): number {
return this.count;
}
public increment(): void {
this.count += 1;
}
public decrement(): void {
this.count -= 1;
}
}
// 사용 예시
const singleton1 = Singleton.getInstance(0);
const singleton2 = Singleton.getInstance(10); // 기존 인스턴스 반환, 초기값 10 무시
console.log(singleton1 === singleton2); // true, instance가 동일
singleton1.increment(); // 0 => 1
console.log(singleton1.getCount()); // 1
singleton2.decrement(); // 1 => 0
console.log(singleton2.getCount()); // 0, 동일한 인스턴스 사용
3 ) function형으로 구현
Singleton
변수는 즉시 실행 함수(IIFE)를 통해 정의됩니다. 이 함수는 instance
라는 변수를 클로저로 가지고 있어 외부에서 직접 접근할 수 없습니다.createInstance
함수: 새로운 싱글톤 인스턴스를 생성하는 내부 함수입니다. 이 함수는 count
상태를 유지하며, 인스턴스가 처음 생성될 때만 호출됩니다.getInstance
메서드: 외부에서 접근 가능한 메서드로, 이미 인스턴스가 존재하면 그 인스턴스를 반환하고, 존재하지 않으면 새로운 인스턴스를 생성합니다.interface Singleton {
getCount(): number;
increment(): void;
decrement(): void;
}
const Singleton = (() => {
let instance: Singleton | null = null;
function createInstance(initialCount: number): Singleton {
let count = initialCount;
return {
getCount() {
return count;
},
increment() {
count += 1;
},
decrement() {
count -= 1;
}
};
}
return {
getInstance(initialCount: number = 0): Singleton {
if (!instance) {
instance = createInstance(initialCount);
}
return instance;
}
};
})();
// 사용 예시
const singleton1 = Singleton.getInstance(0);
const singleton2 = Singleton.getInstance(10); // 기존 인스턴스 반환, 초기값 10 무시
console.log(singleton1 === singleton2); // true, instance가 동일
singleton1.increment(); // 0 => 1
console.log(singleton1.getCount()); // 1
singleton2.decrement(); // 1 => 0
console.log(singleton2.getCount()); // 0, 동일한 인스턴스 사용
싱글톤 패턴은 애플리케이션 전역에서 하나의 인스턴스를 공유하여 사용하고자 할 때 매우 유용한 디자인 패턴입니다. 메모리 절약, 리소스 관리 용이성, 글로벌 상태 관리 등의 장점이 있지만, 테스트의 어려움, 의존성 숨김, 멀티스레드 환경에서의 주의 사항과 같은 단점도 존재합니다. 따라서 싱글톤 패턴을 사용할 때는 이러한 장단점을 충분히 고려한 후, 적절한 상황에서 사용하는 것이 중요합니다.