🔍 팩토리 메서드 패턴
지난 글에서는 심플 팩토리에 대해 알아봤다. 심플 팩토리는 유지보수성과 확장성에 대한 장점이 존재했지만, OCP 원칙에 위배된다는 단점이 존재했다. 이런 한계를 극복한 디자인 패턴 중 하나가 팩토리 메서드(Factory Method) 패턴이다.
▶️ 팩토리 메서드 패턴이란?
팩토리 메서드 패턴은 생성 패턴 중 하나로 객체 생성을 위한 메서드를 클래스에서 직접 구현하는 게 아니라, 서브클래스에서 구현하도록 위임하는 디자인 패턴이다.
즉, 팩토리 메서드를 추상화하여, 구체적인 객체 생성 로직을 서브클래스에 맡기는 패턴이다.
이때 클라이언트는 객체 생성 방식에 대해 알지 못하며, 단지 팩토리 메서드를 호출해 객체 생성을 요청한다.
각 구현클래스의 객체 생성을 서브클래스에서 하기 때문에 새로운 구현 클래스가 추가되어도 기존 팩토리 메서드를 수정하지 않아도 된다. (변경에 닫혀있다는 의미로, 심플 팩토리에서 위배됐던 OCP 원칙을 지킬 수 있다.)
🔑 예제 코드
지난 심플 팩토리에서와 동일하게 자동차(Car) 객체를 생성하는 팩토리 클래스 예제를 알아보자.
▶️ Product(Car)
public interface Car {
void drive();
}
- Car 인터페이스
▶️ Concrete Product(SUV)
public class SUV implements Car {
@Override
public void drive() {
System.out.println("SUV is driving.");
}
}
public class Truck implements Car {
@Override
public void drive() {
System.out.println("Truck is driving.");
}
}
- Car 인터페이스의 구현체 SUV 정의
▶️ Creator(CarFactory)
public abstract class CarFactory {
// 추상 팩토리 메서드
public abstract Car createCar();
}
- 추상 클래스 CarFactory 정의
- 각각의 구현 클래스(SUV, Truck 등)을 생성할 때는 createCar() 메서드를 호출하면 되며, 실제로 어떤 객체를 생성하는지는 추상 메서드를 정의하는 하위 클래스에서 결정한다.
▶️ Concrete Creator(SUVFactory)
public class SUVFactory extends CarFactory {
@Override
public Car createCar() {
return new SUV();
}
}
- CarFactory의 팩토리 메서드 createCar()를 정의한다.
- SUV 객체를 반환하도록 오버라이드 하여 구현한다.
▶️ Main(Client)
public class Main {
public static void main(String[] args) {
// 팩토리 메서드를 사용하여 객체 생성
CarFactory suvFactory = new SUVFactory();
Car suv = suvFactory.createCar();
suv.drive(); // "SUV is driving."
CarFactory truckFactory = new TruckFactory();
Car truck = truckFactory.createCar();
truck.drive(); // "Truck is driving."
}
}
✏️ ConcreteProduct의 확장 (구현클래스 확장)
만약 구현클래스가 추가된다면 어떻게 될까?
다음과 같이 Car의 구현클래스인 Sedan이 추가됐다고 해보자.
public class Sedan implements Car {
@Override
public void drive() {
System.out.println("Sedan is driving.");
}
}
위와 같이 구현클래스(Sedan)이 추가 됐을 때, 기존의 코드는 수정하지 않아도 되며 SedanFactory만 추가하면 된다.
public class SedanFactory extends CarFactory {
@Override
public Car createCar() {
return new Sedan();
}
}
💣 팩토리 메서드 패턴의 한계
심플 팩토리가 OCP를 위배한다는 단점을 팩토리 메서드에서는 보완할 수 있었다.
하지만 새로운 구현클래스를 추가할 때마다 해당 객체에 대한 팩토리 클래스를 정의해야하기 때문에 코드량이 증가한다는 단점이 존재한다.
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 팩토리 패턴(3) - 추상 팩토리 (Abstract Factory) 패턴 (1) | 2025.01.13 |
---|---|
[디자인 패턴] 팩토리 패턴(1) - 심플 팩토리(Simple Factory) (0) | 2024.12.20 |
[디자인 패턴] 템플릿 메서드(Template Method) 패턴 (2) | 2024.12.19 |