반응형
팩토리 패턴(factory pattern)
팩토리 패턴(factory pattern)은 어떤 객체를 만들지를 전적으로 팩토리에 위임합니다.
예시를 위해 빵(bread) 팩토리를 만들어보겠습니다.
먼저 Bread라는 타입을 정의하고 세 종류의 빵을 구현합니다.
type Bread = {
kind: string
}
class FranceBread implements Bread {
kind = 'Baguette'
}
class IndeaBread implements Bread {
kind = 'Flatbread'
}
class DanishBread implements Bread {
kind = 'Ryebread'
}
이 예에선 type을 사용했는데, type 대신 인터페이스를 사용해도 됩니다:)
이제 빵 팩토리를 구현합니다.
type Bread = {
kind: string
}
class FranceBread implements Bread {
kind = 'Baguette'
}
class IndeaBread implements Bread {
kind = 'Flatbread'
}
class DanishBread implements Bread {
kind = 'Ryebread'
}
let Bread = {
create(type: 'baguette' | 'flatbread' | 'ryebread'): Bread { // ①
switch(type) { // ②
case 'baguette': return new FranceBread
case 'flatbread': return new IndeaBread
case 'ryebread': return new DanishBread
}
}
}
- type을 유니온 타입으로 지정해서 컴파일 타임에 호출자가 유효하지 않은 type을 전달하지 못하도록 방지해 .create의 타입 안전성을 최대한 강화했습니다.
- switch문을 이용해 누락된 Bread 타입이 없는지 TypeScript가 쉽게 확인할 수 있게 합니다.
위의 예에선 컴패니언 객체 패턴으로 타입 Bread와 값 Bread를 같은 이름으로 선언했습니다.(TypeScript는 값과 타입의 네임스페이스를 따로 관리합니다)
이렇게 하여 이 값이 해당 타입과 관련한 메서드를 제공한다는 정보를 드러냈습니다.
이 팩토리를 이용하려면 그저 .create를 호출하면 됩니다.
type Bread = {
kind: string
}
class FranceBread implements Bread {
kind = 'Baguette'
}
class IndianBread implements Bread {
kind = 'Flatbread'
}
class DanishBread implements Bread {
kind = 'Ryebread'
}
let Bread = {
create(type: 'baguette' | 'flatbread' | 'ryebread'): Bread { // ①
switch(type) { // ②
case 'baguette': return new FranceBread
case 'flatbread': return new IndianBread
case 'ryebread': return new DanishBread
}
}
}
Bread.create('baguette') // Bread
이 코드를 발전시켜서 'baguette'를 전달하면 FranceBread를 반환하고, 'flatbread'를 전달하면 IndianBread를 반환함을 드러내게끔 Bread.create의 타입 시그니처를 수정할 수 있습니다.
하지만 그러면 팩토리 패턴이 제공하는 추상화 규칙을 깨는 결과를 초래합니다.
호출자는 팩토리가 특정 인터페이스를 만족하는 클래스를 제공할 것이라는 사실만 알 뿐 어떤 구체 클래스가 이 일을 하는지 알 수 없어야 합니다.
반응형
'👶 TypeScript' 카테고리의 다른 글
서브 타입과 슈퍼 타입 (0) | 2023.01.17 |
---|---|
디자인 패턴 - 빌더 패턴(builder pattern) (0) | 2023.01.17 |
final 클래스 흉내 내기 (0) | 2023.01.17 |
데코레이터(decorator) (0) | 2023.01.16 |
믹스인(mixin) (0) | 2023.01.16 |