[디자인패턴] 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
의 객체를
생성해 사용한다. 만약 X1
과 X2
를 생성하는 방식이 달라지거나 X3
와 같이 새로운 클래스의 객체를 생성해야
하는 경우에는 X1
과 X2
를 생성하는 모든 코드 부분을 변경해야한다.
// 객체 생성 기능 제공
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
클래스를 정의하고, 이를 활용하는
방식으로 설계하면 된다. X1
과 X2
의 생성 방식이 변경되거나 X3
를 추가해야할 때 Factory
클래스만
변경하고 A
, B
클래스는 변경할 필요가 없게 된다.