심플 팩토리 패턴(Simple Factory Pattern)은?
생성 패턴 중 하나로 심플 팩토리 패턴은 클라이언트가 입력한 인자에 따라 객체를 분기해서 생성하는 패턴이다. 클라이언트는 직접 객체를 생성하지 않고, 공장 역할을 하는 클래스에 생성을 위임한다.
언제 사용하는가?
팩토리Factory란 이름처럼 자동차 공장에서 세단, SUV, 트럭 등 다양한 차를 생산하는 경우를 떠올릴 수 있다. 이처럼 상황에 따라 다른 객체를 생성해야 할 때 유용하다. 예를 들어, 소셜 로그인 연동 기능을 구현할 때, 카카오 로그인, 네이버 로그인, 구글 로그인 등 다양한 외부 서비스와 연동이 필요하다. 이때 심플 팩토리 패턴을 사용하면, 클라이언트는 어떤 클래스가 생성되는지 알 필요 없이 공장 클래스(Factory Class)에 인자만 넘기면 해당 인자에 맞는 객체를 받아서 사용할 수 있다. 새로운 로그인 서비스를 추가할 때마다 공장 클래스의 분기 로직을 수정해야 하므로 규모가 커지면 유지보수가 번거롭다.
파이썬 예제 코드
from abc import ABCMeta, abstractmethod
class SocialLoginService(metaclass=ABCMeta):
@abstractmethod
def login(self, access_token: str):
pass
class KakaoLoginService(SocialLoginService):
def login(self, access_token: str):
print(f"Kakao login {access_token}")
class NaverLoginService(SocialLoginService):
def login(self, access_token: str):
print(f"Naver login {access_token}")
class SocialLoginFactory:
_services = {
"kakao": KakaoLoginService,
"naver": NaverLoginService,
}
@classmethod
def get_login_service(cls, social_login: str):
try:
return cls._services[social_login]()
except KeyError:
raise ValueError(f"Unsupported social login type: {social_login}")
if __name__ == "__main__":
login_service = SocialLoginFactory.get_login_service("kakao")
login_service.login("kakao_access_token") # Kakao login
login_service = SocialLoginFactory.get_login_service("naver")
login_service.login("naver_access_token") # Naver login
실행 결과
Kakao login kakao_access_token
Naver login naver_access_token