[python] 팩토리 메서드 디자인 패턴
팩토리 메서드는 객체 생성을 캡슐화하는 디자인 패턴입니다. 이 패턴을 사용하면 객체를 생성하는 코드를 클라이언트로부터 분리할 수 있으며, 객체 생성에 대한 유연성을 제공합니다.
팩토리 메서드 디자인 패턴의 구조
팩토리 메서드 디자인 패턴은 다음과 같은 구조로 이루어져 있습니다.
- Creator: 객체를 생성하는 추상 클래스 또는 인터페이스입니다. 이 클래스는 팩토리 메서드를 정의하고, 객체를 생성하는 추상 메서드를 선언합니다.
- Concrete Creator: Creator 클래스를 상속받아 구체적인 객체 생성 방법을 구현하는 클래스입니다.
- Product: 팩토리 메서드로 생성되는 객체의 추상 클래스 또는 인터페이스입니다. 이 클래스는 팩토리 메서드를 사용해 생성되는 객체로 정의됩니다.
- Concrete Product: Product 클래스를 상속받아 실제로 생성되는 객체를 구현하는 클래스입니다.
팩토리 메서드 디자인 패턴의 예시
다음은 Python에서 팩토리 메서드 디자인 패턴을 사용하는 예시 코드입니다.
from abc import ABC, abstractmethod
class PaymentMethod(ABC):
@abstractmethod
def pay(self, amount):
pass
class CreditCardPayment(PaymentMethod):
def pay(self, amount):
print(f"Paying ${amount} with credit card")
class PayPalPayment(PaymentMethod):
def pay(self, amount):
print(f"Paying ${amount} with PayPal")
class PaymentFactory:
def create_payment(self, method):
if method == "creditcard":
return CreditCardPayment()
elif method == "paypal":
return PayPalPayment()
else:
raise ValueError("Invalid payment method")
# 클라이언트 코드
payment_factory = PaymentFactory()
credit_card_payment = payment_factory.create_payment("creditcard")
credit_card_payment.pay(100)
paypal_payment = payment_factory.create_payment("paypal")
paypal_payment.pay(50)
위 코드에서 PaymentMethod
는 Creator에 해당하며, CreditCardPayment
과 PayPalPayment
는 Concrete Creator입니다. PaymentFactory
는 실제로 객체를 생성하는 Factory 메서드를 구현한 클래스입니다. create_payment
메서드는 입력된 값을 기반으로 적절한 PaymentMethod
객체를 생성하여 반환합니다.
클라이언트 코드에서는 PaymentFactory
를 사용해 원하는 결제 방법에 맞는 객체를 생성하고, pay
메서드를 호출하여 결제를 진행할 수 있습니다.
팩토리 메서드 디자인 패턴의 장점
- 객체 생성 로직을 분리하여 코드의 유연성과 재사용성을 높일 수 있습니다.
- 새로운 객체 생성 방법을 추가하려면 Creator 클래스를 수정하지 않고도 독립적으로 추가할 수 있습니다.
- 클라이언트 코드에서는 어떤 구체적인 객체가 생성되는지 알 필요가 없기 때문에, 객체 생성과 사용을 분리함으로써 결합도를 낮출 수 있습니다.
결론
팩토리 메서드 디자인 패턴을 사용하면 객체 생성에 대한 유연성과 재사용성을 높일 수 있으며, 코드의 가독성과 유지 보수성도 개선됩니다. 따라서 객체 생성이 중요한 부분이라면 팩토리 메서드 디자인 패턴을 적용해보는 것이 좋습니다.