생성 디자인 패턴 - 팩토리 메서드 본문
반응형
팩토리 메서드 패턴
- 가상 생성자, Factory Method 라고도 불립니다.
- 팩토리 메서드는 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴입니다.
팩토리 메서드 구성요소
- 제품 인터페이스 : 제품 Interface는 그 제품이 수행하는 고유한 operation을 갖고 있습니다.
- 제품 생성자 : 팩토리메서드를 추상클래스로 정의하고, someOperation 메서드를 갖고, 내부에서 제품을 만들고 제품과 상호작용 합니다.
- 특정 제품 : 제품 Interface를 상속받아서 operation 메서드를구현합니다.
- 즉정 제품 생성자 : 특정제품 생성자는 특정 제품에 대한 팩토리 메서드를 구현합니다. 특정제품 생성자 1이면, 특정 제품 1을 생성하는 팩토리 메서드를 구현합니다.
- 클라이언트 코드 : 클라이언트 코드는 생성자를 인수로 받고 생성자 클래스의 someOperation 메서드를 호출하여 원하는 제품을 생성할 수 있습니다.
요약
- 팩토리 메서드 패턴은 제품을 new 키워드를 사용한 직접 호출 보다는 팩토리 메서드를 정의하고, 호출하여 제품을 생성하라고 제안합니다.
- 제품들을 생성하는 코드를 클라이언트 코드라고 부르고, 클라이언트 코드에서는 제품을 직접 new 키워드를 사용해서 생성하지 않고 팩토리 메서드를 포함하는 생성자 클래스에 위임하여 제품 제작을 맡깁니다.
- 만약 또 다른 제품이 추가되어야 한다면 class ConcreteCreator3 extends Creator를 정의하고 팩토리 메서드 내부에서 제품3을 생성하는 코드를 추가해서 클라이언트가 ConcreteCreator3을 호출하도록 하게 합니다.
반응형
코드
// 제품
interface Product {
operation(): string;
}
// 제품 생성자
abstract class Creator {
public abstract factoryMethod(): Product;
public someOperation(): string {
// 제품을 만들기 위해 팩토리 메서드를 호출합니다.
const product = this.factoryMethod();
// 만들었으면 제품을 사용합니다.
return `생성자는 제품을 만들고 product.operation() 을 실행합니다. => ${product.operation()}`;
}
}
// 특정 제품 생성자 2
class ConcreteCreator1 extends Creator {
public factoryMethod(): Product {
return new ConcreteProduct1();
}
}
// 특정 제품 생성자 2
class ConcreteCreator2 extends Creator {
public factoryMethod(): Product {
return new ConcreteProduct2();
}
}
// 특정제품 1
class ConcreteProduct1 implements Product {
public operation(): string {
return "저는 제품 1의 어떠한 동작입니다.";
}
}
// 특정제품 2
class ConcreteProduct2 implements Product {
public operation(): string {
return "저는 제품 2의 어떠한 동작입니다.";
}
}
function clientCode(creator: Creator) {
// ...
console.log(
"Client: 클라이언트 코드는 생성자를 인수로 받고, 특정 생성자는 팩토리 메서드를 이용하여 특정 제품을 제작합니다.."
);
// creator은 특정 생성자이고 추상 Creator 클래스에서 상속받은 someOperation 메서드를 실행합니다.
console.log(`클라이언트 코드 내부 : ${creator.someOperation()}`);
// ...
}
console.log("\n\n\n");
console.log(
"App: 제품 1을 만들겠습니다. ConcreteCreator1은 제품 1를만드는 팩토리 메서드를 갖고있는 클래스 입니다."
);
clientCode(new ConcreteCreator1());
console.log("");
console.log(
"App: 제품 2을 만들겠습니다. ConcreteCreator2은 제품 2를만드는 팩토리 메서드를 갖고있는 클래스 입니다."
);
clientCode(new ConcreteCreator2());
console.log("\n\n\n");
결과
출처
반응형
'OOP 디자인 패턴 > 생성패턴' 카테고리의 다른 글
생성 디자인 패턴 - 싱글턴 (0) | 2023.05.23 |
---|---|
생성 디자인 패턴 - 프로토타입 (0) | 2023.05.19 |
생성 디자인 패턴 - 빌더 (0) | 2023.05.18 |
생성 디자인 패턴 - 추상 팩토리 (0) | 2023.04.30 |
Comments