[디자인패턴] 12. 팩토리 메서드 패턴 ( Factory Method Pattern )

1. 팩토리 메서드 패턴이란?

팩토리 메서드 패턴(Factory Method Pattern)은 객체의 생성 코드를 별도의 클래스/메서드로 분리함으로써 객체 생성 변화에 대비하는데 유용한 패턴이다.

프로그램이 제공하는 기능은 상황에 따라 변경될 수 있다. 그리고 특정 기능의 구현은 개별 클래스를 통해 제공되는 것이 바람직한 설계이다. 그러므로 기능의 변경이나 상황에 따른 기능의 선택은 해당 객체를 생성하는 코드의 변경을 초래한다. 게다가 상황에 따라 적절한 객체를 생성하는 코드는 중복될 수 있다. 이런 경우 객체 생성 방식의 변화는 해당되는 모든 코드 부분을 변경해야 하는 문제를 일으킨다.

이러한 경우 객체 생성 코드를 별도의 클래스/메서드로 분리해 이용한다면 이 클래스/메서드만 변경함으로써 객체 생성 방식의 변화에 효과적으로 대응할 수 있다.

class A {
    void f() {
        X x;
        if (...)
            x = new X1();
        else
            x = new X2();
    }
    
    x.f1();
}

class B {
    void f() {
        X x;
        if (...)
            x = new X1();
        else
            x = new X2();
    }
    
    x.f2();
}

위 코드와 같이 여러 개의 클래스(A, B)에서 필요에 따라 클래스 X1의 객체와 클래스 X2의 객체를 생성해 사용한다. 만약 X1X2를 생성하는 방식이 달라지거나 X3와 같이 새로운 클래스의 객체를 생성해야 하는 경우에는 X1X2를 생성하는 모든 코드 부분을 변경해야한다.

// 객체 생성 기능 제공
class Factory {
    static X getX(...) {
        X x;
        if (...)
            x = new X1();
        else
            x = new X2();
        return x;
    }
}

class A {
    void f() {
        X x = Factory.getX(...);
        x.f1();
    }
}

class B {
    void f() {
        X x = Factory.getX(...);
        x.f2();        
    }
}

팩토리 메서드 패턴을 사용하면 객체 생성 기능을 제공하는 Factory클래스를 정의하고, 이를 활용하는 방식으로 설계하면 된다. X1X2의 생성 방식이 변경되거나 X3를 추가해야할 때 Factory클래스만 변경하고 A, B클래스는 변경할 필요가 없게 된다.

2. 팩토리 메서드 패턴 예제 : 여러가지 방식의 엘리베이터 스케줄링 방법 지원하기