Factory Method Pattern

 

팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듭니다.

팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것입니다.

 


 

설명

 

버거 주문 과정을 만드려고 합니다.

버거 주문을 받아서 준비 완료까지 만들 예정입니다.

Burger라는 추상 클래스를 만든 다음 Burger를 만들어줄 구상 클래스를 만듭니다.

 

public void orderBurger(String type) {
    Burger burger;
    if (type.equals("cheese")) {
        //burger 객체에 치즈버거 인스턴스 삽입
    }
    else if (type.equals("bulgogi")) {
        //burger 객체에 불고기버거 인스턴스 삽입
    }
    // 버거 종류만큼 else if ...
    
    burger.order();//주문
    burger.makeBurger();//준비 중
    burger.done();//준비 완료
}

 

type의 값에 따라서 인스턴스를 반환합니다.

저렇게 코딩을 하게 되면 메뉴가 늘어날 때마다 주문을 받는 기능에 메뉴를 계속 생성해줍니다.

그래서 인스턴스를 생성해주는 기능을 서브클래스로 분리합니다.

 

public Burger createBurger(String type) {
    if (type.equals("cheese")) return new CheeseBurger();
    if (type.equals("bulgogi")) return new BulgogiBurger();
    if (type.equals("chicken")) return new ChickenBurger();
    return null;
}

 

type에 따라서 인스턴스를 반환해주는 기능만 따로 분리한 것입니다.

이렇게 되면 위에 주문받는 기능은 간단해집니다.

 

 

type에 따라서 인스턴스 생성하던 부분을 서브클래스에 위임하여 코드가 간결해졌습니다.

 

 

Burger: 버거 만드는 과정 추상화.

CheeseBurger: 치즈버거 구현.

ChickenBurger: 치킨버거 구현.

BulgogiBurger: 불고기버거 구현.

BurgerFactory: 구현된 버거 클래스 호출.

BurgerStore: 주문받는 클래스.

Order: 주문하는 클래스.

 


 

구현

 

Burger

package cg.park.designpattern.factory.burgers;

import java.util.ArrayList;
import java.util.List;

abstract public class Burger {
    String name;
    String bun;
    String sauce;
    List<String> toppings = new ArrayList<>();

    public String getName() {
        return name;
    }

    public void order() {
        System.out.println("===========START===========");
        System.out.println("[주문]");
        System.out.println(name);
    }

    public void makeBurger() {
        System.out.println("[재료]");
        System.out.println(bun);
        System.out.println(sauce);
        toppings.forEach(str -> System.out.println(str));
    }

    public void done() {
        System.out.println("===========E N D===========");
    }

}

 

CheeseBurger

package cg.park.designpattern.factory.burgers;

public class CheeseBurger extends Burger {
    public CheeseBurger() {
        name = "Cheese Burger";
        bun = "Cheese bun";
        sauce = "Cheese sauce";
        toppings.add("Cheese");
        toppings.add("Patty");
    }
}

 

BurgerFactory

package cg.park.designpattern.factory.burgers;

public class BurgerFactory {

    public Burger createBurger(String type) {
        if (type.equals("cheese")) return new CheeseBurger();
        if (type.equals("bulgogi")) return new BulgogiBurger();
        if (type.equals("chicken")) return new ChickenBurger();
        return null;
    }
}

 

BurgerStore

package cg.park.designpattern.factory.burgers;

public class BurgerStore {
    BurgerFactory factory;

    public BurgerStore(BurgerFactory factory) {
        this.factory = factory;
    }

    public void orderBurger(String type) {
        Burger burger = factory.createBurger(type);
        burger.order();//주문
        burger.makeBurger();//준비 중
        burger.done();//준비 완료
    }

}

 

Order

package cg.park.designpattern.factory.burgers;

public class Order {

    public static void main(String[] args) {
        BurgerStore store = new BurgerStore(new BurgerFactory());
        store.orderBurger("cheese");//치즈버거 주문
        store.orderBurger("bulgogi");//불고기버거 주문
        store.orderBurger("chicken");//치킨버거 주문
    }

}

 


 

후기

 

팩토리 메서드 패턴에 대해 알아봤습니다.

객체를 생성하기 위한 인터페이스를 정의하고, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만드는 방법입니다. 

감사합니다.

 

Git: https://github.com/qkrcksrbs8/designpattern

참조 자료: Head First Design Patterns

+ Recent posts