팩토리 메서드 패턴
- 객체를 만들어내는 부분을 서브 클래스에 위임하는 디자인 패턴
- 객체를 생성하는 인터페이스를 정의하지만 어떤 클래스의 인스턴스를 생성하리에 대한 결정을 서브클래스가 내리도록 한다.
구현
public interface AirVehicle {
void build();
}
- AirVehicle의 역할을 추상화한 인터페이스
public abstract class AirVehicleFactory {
public AirVehicle create() {
AirVehicle vehicle = createAirVehicle();
vehicle.build();
return vehicle;
}
protected abstract AirVehicle createAirVehicle();
}
- 최상위 factory class로서 객체 생성 메서드를 추상화하여 서브 클래스로 하여금 구현하도록 하는 역할
- 실제 객체를 생성하는 정보는 없으나 객체 생성 메서드인 createAirVehicle()을 통해 AirVehicle을 생성
public class Airplane implements AirVehicle{
@Override
public void build() {
System.out.println("build airplane");
}
}
- AirVehicle 인터페이스를 구현한 Airplane 클래스
public class Helicopter implements AirVehicle{
@Override
public void build() {
System.out.println("build helicopter");
}
}
- AirVehicle 인터페이스를 구현한 Helicopter 클래스
public class AirplaneFactory extends AirVehicleFactory{
@Override
protected AirVehicle createAirVehicle() {
return new Airplane();
}
}
- AirVehicleFactory를 상속받아 Airplane 객체를 생성하는 factory 클래스
public class HelicopterFactory extends AirVehicleFactory{
@Override
protected AirVehicle createAirVehicle() {
return new Helicopter();
}
}
- AirVehicleFactory를 상속받아 Helicopter 객체를 생성하는 factory 클래스
사용 이유
- 클래스 생성과 사용의 로직을 분리하고자 할 경우
- 객체 생성 정보를 캡슐화를 통해 은닉할 경우
단점
- 각 제품 구현체마다 팩토리 객체를 모두 구현해주어야 하기 때문에 서브 클래스 수가 증가
참고
팩토리 메서드(Factory Method) 패턴 - 완벽 마스터하기