팩토리 메서드 패턴 (Factory Method Pattern)은 생성 패턴 중 하나이다
생성 패턴은 인스턴스를 만드는 절차를 추상화하는 패턴입니다.
생성 패턴에 속하는 패턴들은 객체를 생성, 합성하는 방법이나 객체의 표현 방법을 시스템과 분리해줍니다.
팩토리 메서드 패턴이란?
팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이다.

즉, 인스턴스 생성을 서브 클래스에게 위임합니다.
부모 추상 클래스는 인터페이스에만 의존하고 실제로 어떤 구현 클래스를 호출할 지는 서브 클래스에서 구현합니다.
이렇게 하면 새로운 구현 클래스가 추가되어도 기존 Factory 코드의 수정 없이 새로운 Factory 를 추가하면 됩니다.
팩토리 메서드 패턴 (Factory Method Pattern) 코드
public interface User {
void signup();
}
User 인터페이스 정의
public class NaverUser implements User {
@Override
public void signup() {
System.out.println("네이버 아이디로 가입");
}
}
User 인터페이스를 구현하는 NaverUser 클래스 정의
오버라이드한 메서드에는 네이버 유저 전용 로직 추가
public abstract class UserFactory {
public User newInstance() {
User user = createUser();
user.signup();
return user;
}
protected abstract User createUser();
}
추상 클래스로 UserFactory 를 정의
외부에서 User 객체를 생성할 때는 newInstance() 메서드를 호출하면 되고, 실제로 어떤 객체를 생성할 지는 추상 메서드로 정의해서 하위 클래스에서 정의
public class NaverUserFactory extends UserFactory {
@Override
protected User createUser() {
return new NaverUser();
}
}
UserFactory 를 상속받는 NaverUserFactory 를 정의
NaverUser 를 반환하도록 오버라이드
UserFactory userFactory = new NaverUserFactory();
User user = userFactory.newInstance();
클라이언트 코드에서 NaverUser 클래스에 대한 의존성 없이 사용 가능
의존성 주입을 사용해서 외부에서 Factory 클래스를 받아온다면 NaverUserFactory 에 대한 의존성도 제거 가능
팩토리 메서드 패턴의 장점은 확장할 때 기존 코드의 변경이 없어도 된다는 점이다.
public class KakaoUser implements User {
@Override
public void signup() {
System.out.println("카카오 아이디로 가입");
}
}
NaverUser 클래스와 동일하게 User 인터페이스를 구현하는 KakaoUser 클래스 추가
public class KakaoUserFactory extends UserFactory {
@Override
protected User createUser() {
return new KakaoUser();
}
}
NaverUserFactory 클래스와 동일하게 KakaoUserFactory 정의
UserFactory userFactory = new NaverUserFactory();
User user = userFactory.newInstance();
// 위 클라이언트 코드 수정 없이 다른 곳에서 사용 가능
UserFactory kakaoUserFactory = new KakaoUserFactory();
User kakaoUser = kakaoUserFactory.newInstance();
참고 사이트
팩토리 메서드(Factory Method) 패턴 - 완벽 마스터하기
팩토리 메서드 패턴
Factory 패턴 (2/3) - Factory Method (팩토리 메서드) 패턴