DESIGN PATTERN

[디자인패턴] 팩토리 메서드 패턴(Factory Method Pattern) 이란? - 개발자 배찌

개발자 배찌 2022. 4. 12. 15:25
728x90

😀 팩토리 메서드 패턴?
객체를 생성하는 인터페이스는 미리 정의하되, 객체 생성은 팩토리(서브 클래스)로 위임하는 패턴.


😀 팩토리 메서드 패턴을 사용하는 이유?
객체 생성하는 코드를 분리하여 클라이언트 코드와 결합도를 낮추어 코드를 건드리는 횟수를 최소화

😀 팩토리 메서드 패턴 주의점
Factory Method가 중첩되기 시작하면 굉장히 복잡해 질 수 있다. 또한 상속을 사용하지만 부모클래스를 전혀 확장하지 않는다. 따라서, 이 패턴은 extends관계를 잘못 이용한 것으로 볼 수 있다.
extends 관계를 남발하게 되면 프로그램의 엔트로피가 높아질 수 있으므로 Factory Method 패턴의 사용을 주의해야한다.

😀 코드로 알아보자!!

Drink.java

package study.factoryMethodPattern.code1;

public abstract class Drink {
    abstract public void info();
}


Coffee.java

package study.factoryMethodPattern.code1;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Coffee extends Drink{

    @Override
    public void info() {
        log.info("커피 맛");
    }
}


Coke.java

package study.factoryMethodPattern.code1;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Coke extends Drink{
    @Override
    public void info() {
        log.info("콜라 맛");
    }
}


DrinkFactory.java

package study.factoryMethodPattern.code1;

public abstract class DrinkFactory {
    abstract public Drink create(String drinkType);
}


VendingMachine.java

package study.factoryMethodPattern.code1;

public class VendingMachine extends DrinkFactory{
    @Override
    public Drink create(String drinkType) {
        switch(drinkType) {
            case "coffee" :
                return new Coffee();
            case "coke" :
                return new Coke();
            default:
                throw new RuntimeException(drinkType + "is not existed");
        }
    }
}


FactoryMethodPatternTest.java

package study.factoryMethodPattern;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import study.factoryMethodPattern.code1.DrinkFactory;
import study.factoryMethodPattern.code1.VendingMachine;

@Slf4j
public class FactoryMethodPatternTest {

    @Test
    void code1test(){
        DrinkFactory drinkFactory = new VendingMachine();
        //Drink drink1 = drinkFactory.create("coffee");
        //drink1.info();
        drinkFactory.create("coffee").info();
    }
}