Ted's Codding study
팩토리 패턴(Factory Pattern) 본문
TypeScript
팩토리 패턴(Factory Pattern) Ted93 2024. 7. 3. 18:11
- 객체 지향 프로그래밍에서 자주 사용되는 디자인 패턴 중 하나
- 객체의 생성을 캡슐화하여 클라이언트 코드가 생성되는 객체의 구체적인 타입에 의존하지 않도록 하는 것
- 코드의 유연성을 높이고, 변경에 대한 영향을 최소화 가능
1. 팩토리 패턴의 주요 구성 요소
1-1) Product
- 생성될 객체들의 공통 인터페이스
- 팩토리는 이 인터페이스를 구현하는 다양한 객체들을 생성 가능
1-2) ConcreteProduct
- Product 인터페이스를 구현하는 구체적인 클래스들
1-3) Creator
- Product 객체를 생성하는 메서드(factoryMethod)를 선언하는 인터페이스
1-4) ConcreteCreator
- Creator 인터페이스를 구현하며, factoryMethod를 오버라이딩하여 ConcreteProduct 인스턴스를 생성
2. 팩토리 패턴의 장점
2-1) 결합도 감소
- 클라이언트 코드가 구체적인 클래스를 몰라도 객체를 생성 가능, 시스템의 결합도를 낮춤
2-2) 코드 유연성
- 새로운 ConcreteProduct 클래스를 추가하더라도 기존 코드를 변경하지 않고 확장 가능
2-3) 재사용성 향상
- 동일한 방법으로 다양한 객체를 재사용 가능
3. TypeScript에서의 팩토리 패턴 구현 예제
interface Component {
render(): void;
}
// Button 구현
class Button implements Component {
render(): void {
console.log('버튼이 렌더링 됩니다');
}
}
// Checkbox 구현
class Checkbox implements Component {
render(): void {
console.log('체크박스가 렌더링됩니다.');
}
}
// Component Factory
class ComponentFactory {
static createComponent(type: string): Component {
switch (type) {
case 'button':
return new Button();
case 'checkbox':
return new Checkbox();
default:
throw new Error('유효하지 않은 컴포넌트 타입입니다');
}
}
}
// 클라이언트 코드
const button = ComponentFactory.createComponent('button');
button.render();
const checkbox = ComponentFactory.createComponent('checkbox');
checkbox.render();
4. 팩토리 패턴으로 결제 구현 예제
- 여러 타입의 결제 방식을 처리할 수 있는 결제 시스템을 설계
- 다양한 결제 서비스(예: 신용 카드, 페이팔, 은행 이체 등)를 처리 , 클라이언트 코드는 구체적인 결제 방식의 클래스를 몰라도 결제를 진행 가능
요구사항
- 다양한 결제 방식 지원 신용 카드, 페이팔, 은행 이체 등 다양한 결제 방법을 지원
- 결제 방식 쉽게 추가 가능 새로운 결제 방식을 추가할 때 기존 코드를 수정하지 않고 확장 가능
- 결제 방식에 따른 처리 캡슐화 각 결제 방식에 따른 처리 로직은 해당 결제 클래스 내부에서 완결
팩토리 패턴 구성 요소
- PaymentMethod (Interface) 모든 결제 방식이 구현해야 하는 인터페이스, 주로 결제를 실행하는 메소드를 포함
- ConcretePaymentMethods PaymentMethod 인터페이스를 구현하는 구체적인 결제 방식 클래스
- PaymentFactory 결제 방식 객체를 생성하는 팩토리 클래스
구현 코드
- 결제 방법 인터페이스
interface PaymentMethod {
pay(amount: number): void;
}
- 신용 카드 결제 구현
class CreditCard implements PaymentMethod {
pay(amount: number): void {
console.log(`Paid ${amount} using credit card`);
}
}
- 페이팔 결제 구현
class PayPal implements PaymentMethod {
pay(amount: number): void {
console.log(`Paid ${amount} using paypal`);
}
}
- 은행 이체 결제 구현
class BankTransfer implements PaymentMethod {
pay(amount: number): void {
console.log(`Paid ${amount} using bank transfer`);
}
}
- 결제 방법 팩토리
class PaymentFactory {
static createPaymentMethod(method: string): PaymentMethod {
switch (method) {
case 'creditCard':
return new CreditCard();
case 'paypal':
return new PayPal();
case 'bankTransfer':
return new BankTransfer();
default:
throw new Error('지원하지 않는 결제 방식입니다.');
}
}
}
- 클라이언트 코드
const paymentMethod = PaymentFactory.createPaymentMethod('paypal');
paymentMethod.pay(100); // Paid 100 using paypal
const anotherPaymentMethod = PaymentFactory.createPaymentMethod('creditCard');
anotherPaymentMethod.pay(200); // Paid 200 using credit card
노션으로 보고 싶다면?
https://short-echidna-b16.notion.site/Factory-Pattern-6078afebf8634075a69ada72674152aa?pvs=4