ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java Design Pattern - 팩토리 메서드 패턴(Factory Method Pattern)
    Language/Java Design Pattern 2022. 11. 22. 11:27

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

    팩토리 메서드 패턴이란?

    어떠한 상황에서 조건에 따라 객체를 다르게 생성해야 할 경우가 있다.

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

    팩토리 메서드 패턴은 이렇게 분기에 따른 객체의 생성을 직접 하지 않고, 팩토리라는 클래스에 위임하여 팩토리 클래스가 객체를 생성하도록 하는 방식을 말한다.

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

     

    팩토리 메서드 패턴의 사용 이유
    public class Type {
    }
    public class TypeA extends Type {
        public TypeA() {
            System.out.println("TypeA 생성");
        }
    }
    public class TypeB extends Type {
        public TypeB() {
            System.out.println("TypeB 생성");
        }
    }
    public class TypeC extends Type {
        public TypeC() {
            System.out.println("TypeC 생성");
        }
    }
    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;
        }
    }

    TypeA, TypeB, TypeC 클래스를 정의했고, Type 클래스를 상속받아 캡슐화하였다. ClassA의 createType() 메서드에서 type 파라미터에 따라 Type 클래스 생성을 분기 처리하고 있다.

     

     

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

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

    따라서, 팩토리 메서드 패턴을 사용하여, 팩토리 클래스가 다른 객체를 생성할 수 있도록 작업을 위임하는 것이다.

     

    팩토리 메서드 패턴의 적용

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

     

    1. 팩토리 클래스를 정의

    2. 객체 생성이 필요한 클래스에서 팩토리 객체를 생성하여 분기에 따른 객체 생성 메서드를 호출

     

    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가 수행했던 객체를 생성하던 작업을 TypeFactory 클래스가 수행하고 있다.

     

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

    ClassA는 TypeFactory 클래스를 사용하여 객체를 생성하고 있다.

     

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

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


    출처

    https://victorydntmd.tistory.com/299

     

    728x90

    댓글

Designed by Tistory.