팩토리 메서드 패턴 ( Factory Method Pattern )

어떤 상황에서 조건에 따라 객체를 다르게 생성해야 할 때가 있습니다.

예를 들면, 사용자의 입력값에 따라 하는 일이 달라질 경우, 분기를 통해 특정 객체를 생성해야 합니다.

객체마다 하는 일이 다르기 때문에 조건문에 따라 객체를 다르게 생성하는 것은 이상한 일이 아닙니다.


팩토리 메서드 패턴은 이렇게 분기에 따른 객체의 생성( new 연산자로 객체를 생성하는 부분 )을 직접하지 않고,

팩토리라는 클래스에 위임하여 팩토리 클래스가 객체를 생성하도록 하는 방식을 말합니다.

팩토리는 말 그대로 객체를 찍어내는 공장을 의미합니다.





1. 팩토리 메서드 패턴 사용이유

위의 예를 그대로 적용해보겠습니다.

이를 코드로 표현하면 다음과 같습니다.


public abstract class Type {
}
public class TypeA extends Type{
public TypeA(){
System.out.println("Type A 생성");
}
}
public class TypeB extends Type{
public TypeB(){
System.out.println("Type B 생성");
}
}
public class TypeC extends Type{
public TypeC(){
System.out.println("Type C 생성");
}
}
public class ClassA {
public Type createType(String type){
Type returnType = null;
switch (type){
case "A":
returnType = new TypeA();
break;

case "B":
returnType = new TypeB();
break;

case "C":
returnType = new TypeC();
break;
}

return returnType;
}
}
public class Client {
public static void main(String args[]){
ClassA classA = new ClassA();
classA.createType("A");
classA.createType("C");
}
}

TypeA, TypeB, TypeC 클래스를 정의했고, Type 추상 클래스를 정의하여 캡슐화 했습니다.

ClassA의 createType() 메서드에서 문자열 타입 type에따라 Type클래스 생성을 분기처리하고 있습니다.



그런데 이렇게 분기처리하여 객체를 생성하는 코드가 여러 클래스에서 사용하는 경우라면 어떻게 될까요?

위와 같이 중복된 코드가 발생합니다.

또한 객체를 생성하는 일은 객체간의 결합도를 강하게 만드는 일이고, 객체간 결합도가 강하면 유지보수가 어려워집니다.


따라서 팩토리 메서드 패턴을 사용하여, 다른 객체 생성하는 부분을 자신이 하지 않고 팩토리 클래스를 만들어서 팩토리 클래스에서 하도록 할 것입니다.





2. 팩토리 메서드 패턴 적용

팩토리 메서드 패턴을 적용하는 방법은 다음과 같습니다.

  • 팩토리 클래스를 정의
  • 객체 생성이 필요한 클래스( ClassA )에서 팩토리 객체를 생성하여 분기에 따른 객체 생성 메서드를 호출

따라서 Type, TypeA, TypeB, TypeC, Client 클래스의 코드는 동일하고,

팩토리 클래스인 TypeFactory 클래스와 ClassA 클래스를 구현해보겠습니다.

public class TypeFactory {
public Type createType(String type){
Type returnType = null;
switch (type){
case "A":
returnType = new TypeA();
break;

case "B":
returnType = new TypeB();
break;

case "C":
returnType = new TypeC();
break;
}

return returnType;
}
}
public class ClassA {
public Type createType(String type){
TypeFactory factory = new TypeFactory();
Type returnType = factory.createType(type);

return returnType;
}
}

패턴을 적용하기 전 ClassA가 할 일을 TypeFactory 클래스에서 하고 있습니다.

ClassATypeFactory 클래스를 사용하여 객체를 생성하고 있습니다.


즉, 조건에 따른 객체 생성 부분을 자신이 직접하지 않고 팩토리 클래스에 위임하여 객체를 생성하도록 하는 방법이 팩토리 메서드 패턴입니다.

따라서 팩토리 메서드 패턴을 적용함으로써, 객체간의 결합도가 낮아지고 유지보수에 용이해집니다.





이상으로 팩토리 메서드 패턴이 무엇인지에 대해 알아보았습니다.


Java에서도 여러 디자인 패턴을 사용하고 있는데 팩토리 메서드 패턴을 사용하고 있는 API는 다음과 같으며, 참고하시면 좋을 것 같습니다. ( 참고링크 )


Factory method 

(recognizeable by creational methods returning an implementation of an abstract/interface type)