TypeScript를 사용한 싱글톤 및 팩토리 패턴. 미용사와 아이스크림 가게에 대해 설명했습니다.

12318 단어
공학 학교에서 배운 모든 디자인 패턴 중에서 싱글톤과 팩토리는 아마도 일상적인 프로그래밍 활동에서 가장 많이 사용하는 패턴일 것입니다. 가끔은 재미를 두 배로 하기 위해 두 가지를 섞기도 합니다 😜.

이 블로그 게시물에서는 TypeScript 을 사용하여 이러한 패턴을 구현하는 방법을 보여드리겠습니다.


하나씩 일어나는 것



In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one “single” instance (source).



싱글 톤은 아마도 미용사와 같습니다. 이발이 필요할 때 미용실에 가서 새로운 전문가를 구하고 싶지 않을 것입니다. 비록 그녀가 당신과 같은 기술을 공유하지만, 그녀/그는 이미 당신이 좋아하는 설정을 알고 있기 때문에 당신은 정확히 당신의 것을 원합니다 ✂️.

이러한 패턴은 constructorclassprivate 로 정의하여 사실상 클래스 선언 외부에서 액세스할 수 없도록 만들고 생성된 객체의 단일 인스턴스static만 제공함으로써 구현될 수 있습니다. .

export class Hairdresser {
  private static instance: Hairdresser | undefined = undefined;

  private constructor() {}

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

    return Hairdresser.instance;
  }
}


위의 스니펫을 사용하면 새로운 미용사를 구할 수 없습니다. 새 개체를 인스턴스화하려고 하면 오류가 발생합니다.

// TS2673: Constructor of class 'Hairdresser' is private and only accessible within the class declaration.
const hairdresser: Hairdresser = new Hairdresser();


반대로 인스턴스에 액세스하면 항상 초기화된 첫 번째 개체가 반환됩니다.

const hairdresser: Hairdresser = Hairdresser.getInstance();



공장



In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method rather than by calling a constructor (source).



공장 패턴은 Eisvogel과 같습니다. 제가 가장 좋아하는 취리히 최고의 아이스크림 가게입니다. 그들은 매일 제조하는 장인의 맛있는 아이스크림을 매일 5가지 새로운 맛으로 판매합니다.

당신이 거기에 도착했을 때, 당신은 당신이 아이스크림을 얻을 것이라는 것을 알고 있지만, 당신은 어떤 맛인지 모릅니다.

즉, 팩토리를 사용하여 예상되는 동작을 공유하지만 다르게 구현될 수 있는 개체를 가져올 수 있습니다.

첫째, 팩토리에서 생성해야 하는 예상 객체의 효과적인 구현 외에도 일반적인 동작을 설명하는 interface 또는 abstract 클래스가 필요합니다.
interface 포함:

export interface IceCream {
  yummy(): boolean;
}

export class Strawberry implements IceCream {
  yummy(): boolean {
    return true;
  }
}

export class Chocolate implements IceCream {
  yummy(): boolean {
    return true;
  }
}

abstract 사용(참고: 메서드가 부모 정의를 재정의함을 나타내는 TypeScript 4.3에 새로 도입된 데코레이터 사용 override ):

export abstract class IceCream {
  abstract yummy(): boolean;
}

export class Strawberry extends IceCream {
  override yummy(): boolean {
    return true;
  }
}

export class Chocolate extends IceCream {
  override yummy(): boolean {
    return true;
  }
}


위의 구현과 관계없이 관련 팩토리를 구현할 수 있습니다. static 메서드 또는 무상태function 형식일 수 있습니다. 중요한 것은 매개변수에 따라 원하는 구현이 생성되고 반환된다는 것입니다.
static 메서드 사용:

export class Factory {
  static getIceCream(): IceCream {
    return Math.random() % 2 === 0 ? 
                new Strawberry() : new Chocolate();
  }
}

function:

export const getIceCream = (): IceCream =>
  Math.random() % 2 === 0 ? new Strawberry() : new Chocolate();

random 번호를 사용하여 하나 또는 다른 유형의 개체를 만들었습니다. 실제 애플리케이션에서 변수는 종종 공장의 매개변수이거나 다른 옵션입니다.
static 메서드 또는 function를 통해 개체를 요청하면 다른 개체가 반환됩니다.

// Static method call 
console.log(Factory.getIceCream().yummy());

// Function call
console.log(getIceCream().yummy());



결합



서론에서도 말했듯이 가끔은 재미도 두배로 두 패턴을 합치는 것을 좋아합니다.

예를 들어 DeckDeckGo에서 환경("로컬, 스테이징 또는 프로덕션")에 따라 다른 서비스를 받을 수 있도록 이러한 개념을 개발했습니다.

위의 IceCream 스니펫에 적용하면 factorysingleton로 생성된 객체를 추적해야 함을 의미합니다.

export class SingletonFactory {
  private static instance: IceCream | undefined = undefined;

  static getInstance(): IceCream {
    if (!this.instance) {
      this.instance =
        Math.random() % 2 === 0 ? 
             new Strawberry() : new Chocolate();
    }

    return this.instance;
  }
}



요약



patterns 많이 있지만 제가 가장 자주 사용하는 것들입니다. 다음에 다른 유형을 사용하면 북마크해야 할 것 같습니다. 새 기사의 가치가 있습니다 😉.

한편, 다음에 취리히 🍦를 방문하면 맛있는 Eisvogel 아이스크림으로 자신을 대접하십시오.

무한과 그 너머로!

다윗


또는 mywebsite로 저에게 연락할 수 있습니다.

다음 프레젠테이션을 위해 DeckDeckGo을 사용해 보십시오!

좋은 웹페이지 즐겨찾기