본문 바로가기

생성 디자인 패턴 - 싱글턴 본문

OOP 디자인 패턴/생성패턴

생성 디자인 패턴 - 싱글턴

개발자로 거듭나기 2023. 5. 23. 16:35
반응형

싱글턴 패턴 (Singleton)

  • 싱글턴은 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근(액세스) 지점을 제공하는 생성 디자인 패턴입니다.
  • 싱글턴 패턴은 다음의 두가지 상황을 구현합니다.
    • 클래스의 인스턴스가 하나만 있게 합니다 ⇒ 객체는 최초 1회 생성되고, 다른 객체의 생성을 시도했을 때 똑같은 객체를 돌려받게 됩니다. 물론 new 키워드를 이용하여 객체를 생성하면 무조건 새 객체를 돌려받게 되므로 일반적인 생성방법으로는 구현할 수 없습니다.
    • 해당 인스턴스에 대한 전역접근 지점 제공 ⇒ 이는 마치 전역변수와 같은 기능을 하는데, 덮어씌워질 위험이 있는 전역변수와 다르게 이러한 상황에 대한 보호를 제공합니다.
  • 위의 상황중 한가지만 해결해도 싱글턴 패턴이라 부를 수 있습니다.
  • 대표적인 상황으로 DB연결을 하나의 객체만을 사용해서 연결하고 싶을 때 사용합니다.

싱글턴 구성요소

  1. Singleton 클래스 : 생성자를 private로 막고 getInstance() 메서드로 선언하여서 객체를 관리합니다.
    1. getInstance() : 싱글턴 객체가 존재하면 존재하는 걸 반환하고 없으면 최초로 1회생성
    2. doSomething() : 싱글턴 객체에서의 비즈니스 로직

요약

  • 싱글턴을 만드는 과정은
    1. 다른 코드에서 new 생성자로 객체를 생성하지 못하도록 생성자를 비공개로 막아둡니다.
    2. 생성자 역할을 하는 정적 생성 메서드를 만듭니다. 내부적으로 이 메서드는 객체를 만들기 위하여 비공개 생성자를 호출한 후 객체를 정적 필드에 저장합니다. 이 메서드에 대한 그다음 호출들은 모두 캐시된 객체를 반환합니다. (getInstance())
  • 이로써 객체를 생성하면 모두 같은 객체를 돌려받게 됩니다.

코드

class Singleton {
  // 실제로 싱글턴에 접근하는 객체들이 이용할 멤버변수, 이걸로 비즈니스 로직 실행
  private static instance: Singleton;

  // 외부에서 인스턴스 생성 금지(private)
  private constructor() {}

  // 싱글턴 인스턴스에 접근을 제어하는 정적 메서드. 클라이언트는 정적 메서드로 유일한 싱글턴 인스턴스를 접근할 수 있다.
  public static getInstance(): Singleton {
    // 없으면 싱글턴 클래스의 유일한 인스턴스를 생성한다.
    if (!Singleton.instance) {
      Singleton.instance = new Singleton();
    }
    return Singleton.instance; // 있으면 있는거 return
  }

  // 인스턴스에서 실제 수행할 비즈니스 로직
  public doSomething(): void {
    console.log("Singleton instance is doing something.");
  }
}

// 2개를 생성하던 100개를 생성하던 싱글턴으로 만들어진 인스턴스는 모두 동일한 인스턴스이다.
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // true
instance1.doSomething(); // "Singleton instance is doing something."
instance2.doSomething(); // "Singleton instance is doing something."

결과

출처

https://refactoring.guru/ko/design-patterns/singleton

반응형
Comments