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

고지훈·2021년 9월 17일
1

DesignPattern

목록 보기
5/16
post-thumbnail

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

특정 상황에서 조건에 따라 객체를 다르게 생성해야 할 때가 있다.
예를 들면 사용자의 입력값에 따라 하는 일이 달라질 경우, 분기를 통해 특정 객체를 생성해야한다.
객체마다 하는 일이 다르기 때문에 조건문에 따라 객체를 다르게 생성하는 것은 이상한 일이 아니다.

팩토리메소드패턴은 분기에 따른 객체의 생성을 직접하지 않고, 팩토리라는 클래스에 위임하여 팩토리 클래스가 객체를 생성하도록 하는 방식을 말한다. 팩토리는 말 그대로 객체를 찍어내는 공장을 의미한다.


왜, 팩토리메소드패턴을 사용할까?

// Type.java
public abstract class Type {
}
// TypeA.java
public class TypeA extends Type {
    public TypeA() {
        System.out.println("Type A 생성");
    }
}
// TypeB.java
public class TypeB extends Type {
    public TypeB() {
        System.out.println("Type B 생성");
    }
}
// TypeC.java
public class TypeC extends Type {
    public TypeC() {
        System.out.println("Type C 생성");
    }
}
// ClassA.java
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;
    }
}
// Client.java
public class Client {
    public static void main(String args[]) {
        ClassA classA = new ClassA();
        classA.createType("A");
        classA.createType("C");
    }
}

TypeA, TypeB, TypeC클래스를 정의했고, Tyoe 추상 클래스를 정의하여 캡슐화를 했다.
ClassA의 createType()메서드에서 문자열 타입 type에 따라 Type클래스 생성을 분기처리하고 있다.

만약 위와같은 방식으로 분기처리하여 객체를 생성하는 코드가 여러 클래스에서 사용하는 경우라면 어떻게 될까?

위와 같이 중복되는 코드가 발생한다.
객체를 생성하는 일은 객체간의 결합도를 강하게 만드는 일이고, 객체간 결합도가 강하면 유지보수가 어려워진다.

따라서 팩토리메소드패턴을 사용하여, 다른 객체 생성을 자신이 하지 않고 팩토리 클래스를 만들어서 수행시키도록 할 것이다.


팩토리메소드패턴 구현

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

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

따라서 Type, TypeA, TypeB, TypeC, Client클래스의 코드는 동일하고, 팩토리 클래스인 TypeFactory클래스와 ClassA클래스를 구현하겠다.

// TypeFactory.java
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;
    }
}
// ClassA.java
public class ClassA {
    public Type createType(String type) {
        TypeFactory factory = new TypeFactory();
        Type returnType = factory.createType(type);

        return returnType;
    }
}

패턴을 적용하기 전 ClassA가 할 일을 TypeFactory클래스에서 하고 있다. ClassA는 TypeFactory클래스를 사용하여 객체를 생성하고 있다.

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

팩토리메소드패턴을 적용함으로써, 객체간의 결합도가 낮아지고 유지보수가 용이해짐을 알 수 있다.

팩토리메소드패턴 학습 시 참고 블로그: https://victorydntmd.tistory.com/299?category=719467

profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글