본문 바로가기

IT/디자인 패턴

[디자인 패턴] 팩토리 메소드 패턴

1. 팩토리 메소드 패턴이란?

객체를 생성하기 위한 인터페이스를 정의하고, 어떤 클래스의 인스턴스를 생성할지에 대한 처리는 서브클래스가 결정하는 디자인 패턴
- GoF

 

참조 : https://johngrib.github.io/wiki/factory-method-pattern/

 

2. 팩토리 메소드 패턴을 사용하는 이유

팩토리 메소드 패턴을 사용하는 이유는 클래스의 생성과 사용의 처리로직을 분리하여 결합도를 낮추기 위한 것 입니다. 
결합도는 간단히 말해서 클래스의 처리 로직에 대한 변경점이 생겼을 때 얼마나 사이드 이펙트를 주는가 인데, 팩토리 메소드 패턴을 사용할 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 생성 로직을 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거 합니다.

 

3. 팩토리 메소드 패턴 예제

1) 음료수의 추상 클래스

public abstract class Drink {

    abstract public String info();
    
}
음료수의 베이스가 되는 추상클래스입니다. 모든 음료수는 info() 메소드를 오버라이딩해야 합니다.

 

2) 음료수 클래스

public class Coffee extends Drink {

    @Override
    public String info() {
        return "커피 맛";
    }

}
public class Coke extends Drink {

    @Override
    public String info() {
        return "콜라 맛";
    }

}
public class Tejava extends Drink {

    @Override
    public String info() {
        return "크래파스 맛";
    }

}
Drink 추상 클래스를 상속받는 음료수 클래스입니다. 각 클래스는 info() 메소드를 오버라이딩합니다.

 

3) 음료수 타입 (enum)

public enum DrinkType {
    Coke, Coffee, Tejava
}
음료수 타입은 enum으로 지정했습니다.

 

4) Factory Class

public abstract class DrinkFactory {
    abstract Drink create(DrinkType drinkType);
}
//factory class
public class VendingMachine extends DrinkFactory {

    @Override
    public Drink create(DrinkType drinkType) {

        switch (drinkType) {
            case Coffee:
                return new Coffee();
            case Coke:
                return new Coke();
            case Tejava:
                return new Tejava();
            default:
                throw new RuntimeException(drinkType.toString() + " is not existed");
        }
    }
}
DrinkFactory 클래스의 서브 클래스인 VendingMachine 클래스에서 create() 메소드를 오버라이딩합니다.
create 메소드의 파라미터로 drinkType을 전달받아 Drink 객체를 생성합니다.

 

5) Main

public class Main {

    public static void main(String[] args) {
        
        DrinkFactory drinkFactory = new VendingMachine();

        Drink drink1 = drinkFactory.create(DrinkType.Coffee);
        Drink drink2 = drinkFactory.create(DrinkType.Tejava);

        System.out.println(drink1.info());
        System.out.println(drink2.info());

    }

}
create 메소드에 DrinkType enum을 파라미터로 전달해 Drink 객체를 생성합니다.

 

6) 결과

커피 맛
크래파스 맛

참조 :
jdm.kr/blog/180
johngrib.github.io/wiki/factory-method-pattern/