Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

팩토리 메소드 패턴 (Factory method pattern) 본문

디자인패턴

팩토리 메소드 패턴 (Factory method pattern)

개발자가되고싶어 2021. 6. 9. 22:34
팩토리 메소드 패턴

 

팩토리 메소드 패턴이란 무엇일까? 

우선 아래의 코드를 보도록 하겠습니다.

public class BurgerMain {

    public static void main(String[] args) {
        BurgerStore store = new BurgerStore();
        CheeseBurger burger = store.order();
    }

}
public class BurgerStore {

    CheeseBurger order() {
        return new CheeseBurger();
    }
    
}

햄버거 가게에 햄버거 주문이 들어왔습니다. 그런데 버거를 주문해봤자 치즈버거만 제공해 줄 수 있는 상황입니다. 너무 극단적인 상황이죠.. 불고기 버거를 추가해 보겠습니다.

 

public class BurgerStore {

    CheeseBurger order() {
        return new CheeseBurger();
    }
    
    BulgogiBurger order2() {
        return new BulgogiBurger();
    }
    
}

자 이렇게 하나하나 추가하면 되겠군요! 버거의 종류가 많아지기 전까진 말이죠. 그리고 BurgerStore 와 각각의 Burger 클래스 간의 의존성이 너무 강하게 생겨버렸습니다.

위와 같은경우는 너무 극단적인 예시이긴 합니다.

 

자 이제 팩토리 메소드 패턴을 도입해 보겠습니다.

 

public interface Burger {
    void burger();
}

public class CheeseBurger implements Burger {
    @Override
    public void burger() {
        System.out.println("치즈버거");
    }
}

각 햄버거 클래스 에는 Burger 인터페이스를 만들어 구현해주도록 했습니다.

public class BurgerFactory {
    public Burger burger(String burgerType) {
        switch (burgerType) {
            case "치즈버거" : return new CheeseBurger();
            case "불고기버거" : return new BulgogiBurger();
            default: return new NormalBurger();
        }
    }
}

public class BurgerStore {
    private BurgerFactory factory = new BurgerFactory();
    
    Burger order(String burgerType) {
        return factory.burger(burgerType);
    }
}

public class BurgerMain {
    public static void main(String[] args) {
        BurgerStore store = new BurgerStore();
        Burger burger = store.order("치즈버거");
        burger.burger();
    }
}

이제 BurgerStore 에서는 버거 타입을 전달받아 BurgerFactory 에서 버거를 받아오기만 하면 됩니다! 객체의 생성을 팩토리 메소드에 위임한 결과입니다. 

 

하지만 사실 위의 예시같은 경우는 안쓰느니만 못한 코드처럼 보일 수 있습니다.

하지만 변할수 있는 것을 분리하여 캡슐화한 것만으로도 유연한 코드로 바뀌었다고 볼 수 있겠습니다.

 

틀린 부분은 언제든 피드백 환영하며 읽어주셔서 감사합니다.