프로그래밍
싱글톤 패턴
수박수박좋다
2024. 7. 11. 20:09
반응형
싱글톤 패턴
클래스의 객체 인스턴스가 하나만 만들어지도록 하는 패턴
전역변수와 역할이 비슷하며 객체가 하나만 생성되기에 변경되지 않는다는 점이 있음
스레드 풀, 설정 등 불변하는 것들을 공유하기 위한 방법 중 하나
public으로 설정된 생성자가 없음
getInstance
라는 객체호출을 사용함
클래스 예제
class Singleton {
// 클래스의 유일한 인스턴스를 저장할 private static 변수
private static instance: Singleton | null = null;
// 싱글톤 클래스 내부의 데이터
private data: string;
// private 생성자로 외부에서 인스턴스 생성을 막음
private constructor() {
this.data = "Initial data";
}
// 유일한 인스턴스를 반환하는 static 메서드
public static getInstance(): Singleton {
if (Singleton.instance === null) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
// 데이터를 가져오는 메서드
public getData(): string {
return this.data;
}
// 데이터를 설정하는 메서드
public setData(newData: string): void {
this.data = newData;
}
}
// 사용 예시
const singleton1 = Singleton.getInstance();
const singleton2 = Singleton.getInstance();
console.log(singleton1 === singleton2); // true, 동일한 인스턴스
console.log(singleton1.getData()); // "Initial data"
// 데이터를 설정
singleton1.setData("New data");
console.log(singleton2.getData()); // "New data",
- Object.freeze를 통해 더욱 더 견고한 싱글톤을 구현할 수 있음
- 함수로도 간단하게 구현이 가능함
상태관리
패턴을 보니까 바로 상태관리가 떠올라서 zustand코드를 보았다
zustand의 사용법은 여타 다른 상태관리라이브러리와 마찬가지로 초기에 한번만 store를 만들고 이를 공유하는 방식이다
Provider로 묶인 스코프내에서 생성된 하나의 store만 사용하는 점은 싱글톤패턴과 크게 다르지 않은 것 같다.
- zustand는 바닐라로 짜여져있는데 useSyncExternalStore를 통해 리액트에 상태관리를 연결하고 있다.
- 이외에 멀티쓰레딩에서 참조될 때의 문제점 등이 나타나있지만 앞으로 봐야할 패턴이 워낙 많으니 훑고 지나가기로
반응형