본문 바로가기
OOD/Creational Design Patterns(생성패턴)

Factory Method patterns

by Box 2021. 11. 22.
728x90

팩토리 메서드 패턴 ( 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 클래스를 구현해보겠습니다.

그리고 밑에 코드블럭은 ts 기반으로 구현 해보았습니다.

 abstract class Type {
}
 class TypeA extends Type {
    public TypeA(){
        console.log("Type A 생성");
    }
}
 class TypeB extends Type{
    public TypeB(){
        console.log("Type B 생성");
    }
}
 class TypeC extends Type{
    public TypeC(){
        console.log("Type C 생성");
    }
}
 class TypeFactory  {
    public createType(type){
         var returnType = null;
        switch (type){
            case "A":
                returnType = new TypeA()
                break
            case "B":
                returnType = new TypeB();
                break;

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

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

        return returnType;
    }
}

const test = new ClassA()
test.createType("A")
console.log(test.createType("A")
)

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

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

 

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

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

 

 

feat-((https://victorydntmd.tistory.com/299?category=719467))