언어 Language/파이썬 Python
[디자인 패턴] 추상 팩토리 패턴과 파이썬 예제 코드
Tap to restart
2025. 4. 27. 11:00
추상 팩토리 패턴(Abstract Factory Pattern)은?
생성 패턴 중 하나로 추상 팩토리 패턴은 관련성 있는 여러 제품군을 한 번에 생성할 수 있도록 도와주는 패턴이다. 팩토리 메소드 패턴은 단일 제품군을 다루지만 추상 팩토리 패턴은 여러 제품군을 한 번에 생성한다.
언제 사용하는가?
서로 관련 있는 여러 객체를 한 번에 생성하고 싶을 때 사용한다. 팩토리 메소드 패턴은 예를 들면 소셜 로그인처럼 하나만 다루지만, 추상 팩토리 패턴은 로그인 서비스와 결제 서비스처럼 연관된 여러 제품군을 함께 다루는데 적합하다. 카카오 플랫폼에서는 카카오 로그인과 카카오페이를, 네이버 플랫폼에서는 네이버 로그인과 네이버페이를 함께 사용해야 한다. 이 경우 추상 팩토리 패턴을 사용하면 카카오 제품군과 네이버 제품군을 묶어서 일관성 있게 생성할 수 있고, 클라이언트는 플랫폼 종류만 선택하면 된다.
추상 팩토리 패턴을 사용하면 관련 제품군들이 함께 생성되므로 제품 간 호환성을 보장할 수 있다. 새롭게 애플 플랫폼(애플 로그인과 애플 페이)을 추가할 때 기존 클라이언트 코드 수정 없이 확장할 수 있다.
파이썬 예제 코드
from abc import ABCMeta, abstractmethod
# Abstract Product
class SocialLoginService(metaclass=ABCMeta):
@abstractmethod
def login(self, access_token: str):
pass
class PaymentService(metaclass=ABCMeta):
@abstractmethod
def pay(self, amount: int):
pass
# Concrete Product
class KakaoLoginService(SocialLoginService):
def login(self, access_token: str):
print(f"Kakao login with {access_token}")
class KakaoPayService(PaymentService):
def pay(self, amount: int):
print(f"KakaoPay: ₩{amount}")
class NaverLoginService(SocialLoginService):
def login(self, access_token: str):
print(f"Naver login with {access_token}")
class NaverPayService(PaymentService):
def pay(self, amount: int):
print(f"NaverPay: ₩{amount}")
# Abstract Factory
class PlatformFactory(metaclass=ABCMeta):
@abstractmethod
def create_login_service(self) -> SocialLoginService:
pass
@abstractmethod
def create_payment_service(self) -> PaymentService:
pass
# Concrete Factory
class KakaoPlatformFactory(PlatformFactory):
def create_login_service(self) -> SocialLoginService:
return KakaoLoginService()
def create_payment_service(self) -> PaymentService:
return KakaoPayService()
class NaverPlatformFactory(PlatformFactory):
def create_login_service(self) -> SocialLoginService:
return NaverLoginService()
def create_payment_service(self) -> PaymentService:
return NaverPayService()
if __name__ == "__main__":
# Kakao
kakao_factory = KakaoPlatformFactory()
login_service = kakao_factory.create_login_service()
payment_service = kakao_factory.create_payment_service()
login_service.login("access_token")
payment_service.pay(10000)
print()
# Naver
naver_factory = NaverPlatformFactory()
login_service = naver_factory.create_login_service()
payment_service = naver_factory.create_payment_service()
login_service.login("access_token")
payment_service.pay(10000)
실행 결과
Kakao login with access_token
KakaoPay: ₩10000
Naver login with access_token
NaverPay: ₩10000