728x90
공부하면서 느낀 정의와 코드 작성! 해당글에서 공부하면서 오답을 알게 되었다면 글을 업데이트 할 예정입니다.
싱글톤(Singleton) 패턴의 정의는 단순하다. 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다. 싱글톤 패턴을 사용하는 이유나 주의할 점은 조금 후에 살펴보기로 하고, 어떻게 생겼는지 그 모습을 책에서 나온 코드로 먼저 만나보자.
class Singleton {
private static instance: Singleton;
private constructor() { }
public static getInstance(): Singleton {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
public someBusinessLogic() {
// ...
}
}
/**
* The client code.
*/
function clientCode() {
const s1 = Singleton.getInstance();
const s2 = Singleton.getInstance();
if (s1 === s2) {
console.log('Singleton works, both variables contain the same instance.');
} else {
console.log('Singleton failed, variables contain different instances.');
}
}
clientCode();
사용하면 이점은?
가장 먼저 떠올릴 수 있는 이점은 아무래도 메모리 측면일 것이다. 최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다고 볼 수 있다.
그렇다면 단점은?
자식클래스를 만들수 없다는 점과, 내부 상태를 변경하기 어렵다는 점 등 여러가지 문제들이 존재한다
모듈에선 어떻게 사용하면 될까?
공부하면서 제일 처음본 패턴이고 해당 패턴에대해 클래스가 아닌 함수 모듈로는 어떻게 작성해야할지 고민해봤다
// 전역변수에 직접 접근하는게 아니라 getter로 접근하도록 인위적인 수정을 가할수없게 레이어를 둔다.
const axiosInstanceMap = {};
const getTempMapInstance = (key: string, config: AxiosConfig) => {
if(axiosInstanceMap[key]) return axiosInstanceMap[key];
const instance = axios.create(config);
axiosInstanceMap[key] = instance;
return axiosInstanceMap[key];
};
변수에 직접 접근하는 것을 제한하고 getTempMapInstance
를 통해서 접근하도록 하였다. 이미 동일한 인스턴스가 존재한다면 기존 인스턴스를 리턴하고 존재하지 않는다면 인스턴스를 생성하고 전역 변수에 담아 두는 식으로 작성해 봤다.
728x90
'디자인패턴' 카테고리의 다른 글
디자인패턴 - 프록시 패턴 (0) | 2024.02.18 |
---|---|
디자인패턴 - 어댑터 패턴 (0) | 2024.02.18 |
디자인패턴 - 퍼사드패턴 (0) | 2024.02.17 |
디자인패턴 - 팩토리 메서드 패턴, 추상 팩토리 패턴 (0) | 2024.02.16 |
디자인 패턴 (0) | 2024.02.15 |
댓글