본문 바로가기
디자인패턴

디자인패턴 - 싱글톤(Singleton) 패턴

by KBS 2024. 2. 15.
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

댓글