반응형
팩토리 메소드 패턴(Factory Method Pattern)은?
생성 패턴 중 하나로 팩토리 메소드 패턴은 객체 생성을 서브클래스에 위임해서, 클라이언트 코드가 구체 클래스에 직접 의존하지 않도록 만드는 생성 패턴이다. 객체 생성 코드를 분리함으로써 새로운 타입이 추가되더라도 기존 클라이언트 코드를 수정할 필요 없이 확장할 수 있다.
언제 사용하는가?
팩토리Factory란 이름처럼 자동차 공장에서 세단, SUV, 트럭 등 다양한 차를 생산하는 경우를 떠올릴 수 있다. 이처럼 상황에 따라 다른 객체를 생성해야 할 때 유용하다.
예를 들어, 소셜 로그인 연동 기능을 구현할 때, 카카오 로그인, 네이버 로그인, 구글 로그인 등 다양한 외부 서비스와 연동이 필요하다. 이때 팩토리 메소드 패턴을 사용하면 객체 생성과 객체 활용 코드가 분리되어서 클라이언트는 어떤 클래스가 생성되는지 알 필요가 없고, 새로운 로그인 서비스가 추가되어도 클라이언트 코드를 수정할 필요 없이 확장할 수 있다.
파이썬 예제 코드
from abc import ABCMeta, abstractmethod
# Product
class SocialLoginService(metaclass=ABCMeta):
@abstractmethod
def login(self, access_token: str):
pass
# Concrete Products
class KakaoLoginService(SocialLoginService):
def login(self, access_token: str):
print(f"Kakao login with {access_token}")
class NaverLoginService(SocialLoginService):
def login(self, access_token: str):
print(f"Naver login with {access_token}")
# Creator
class SocialLoginFactory(metaclass=ABCMeta):
@abstractmethod
def create_login_service(self):
pass
# Concrete Creators
class KakaoLoginFactory(SocialLoginFactory):
def create_login_service(self) -> SocialLoginService:
return KakaoLoginService()
class NaverLoginFactory(SocialLoginFactory):
def create_login_service(self) -> SocialLoginService:
return NaverLoginService()
# Client
class AuthService:
def __init__(self, factory: SocialLoginFactory):
self.login_service = factory.create_login_service()
def login(self, access_token: str):
return self.login_service.login(access_token)
if __name__ == "__main__":
# Kakao 로그인
kakao_factory = KakaoLoginFactory()
kakao_auth_service = AuthService(kakao_factory)
kakao_auth_service.login("kakao_access_token")
print()
# Naver 로그인
naver_factory = NaverLoginFactory()
naver_auth_service = AuthService(naver_factory)
naver_auth_service.login("naver_access_token")
실행 결과
Kakao login with kakao_access_token
Naver login with naver_access_token
반응형