본문 바로가기
OOD/Creational Design Patterns(생성패턴)

Singleton Pattern(싱글톤 패턴)

by Box 2021. 11. 22.
728x90

싱글톤 패턴 ( Singleton Pattern )

  • 싱글톤 패턴이란, 인스턴스가 프로그램 내에서 오직 하나만 생성되는 것을 보장하고, 프로그램 어디에서든 이 인스턴스에 접근할 수 있도록 하는 패턴입니다.
  • 즉, 인스턴스가 사용될 때 똑같은 인스턴스를 여러 개 만드는 것이 아니라, 기존에 생성했던 동일한 인스턴스를 사용하게끔 하는 것입니다.
  • 전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴

참고
생성(Creational) 패턴
객체 생성에 관련된 패턴
객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.

ts 로 구현한 상태

class Singleton {
    private static instance: Singleton;

    private constructor() { }

    public static getInstance(): Singleton {
        if (!Singleton.instance) {
            Singleton.instance = new Singleton();
        }

        return Singleton.instance;
    }

    public static someBusinessLogic(): Singleton {
//..
    }
}

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();

먼저 외부에서 객체를 생성할 수 없도록 생성자를 private으로 선언합니다.

즉, 객체 생성에 대한 관리를 내부적으로 하겠다는 의미이죠.

 

그러면 외부에서 SingleObj 객체를 생성할 수 없으므로, 미리 생성된 자신을 반환할 수 있도록 getInstance() 메서드를 정의합니다.

주의해야 할 것은 static으로 정의가 되었다는 점입니다.

생성자를 private으로 선언했기 때문에 객체를 생성할 수 없으므로, getInstacne() 메서드가 클래스에 정의되도록 static 제어자를 사용했습니다.

 

getInstance() 메서드를 호출했을 때,

  • singleObj 변수에 객체가 할당되지 않으면( == null ) 새로운 객체를 생성하고,
  • singleObj 변수에 객체가 이미 있으면 그것을 그대로 반환합니다.