디자인 패턴 - 팩토리 메소드 패턴

안성은·2022년 4월 10일
0

Disign Pattern

목록 보기
2/9

팩토리 메소드 패턴

  • 정의

    • 팩토리 메소드 패턴은 객체를 생성하기 위한 인터페이스 정의 후 어떤 클래스의 인스턴스를 만드는 것을 서브 클래스에서 결정
    • 생성 부분과 사용 부분 분리 가능
  • 사용하는 이유

    • 추상화(클라이언트)와 인스턴스를 만들어야 하는 구상 클래스를 분리시켜야 할 때 사용
    • 객체 생성을 캡슐화해서 애플리케이션의 결합을 느슨하게 만들고, 구현의 덜 의존화시켜서 유연성과 확장성을 가짐
  • 방법

  • 실제 적용 UML

  • 레거시 코드
public class DependentPizzaStore {

    public Pizza createPizzaStore(String storeName, String pizzaType) {
        Pizza pizza = null;

        if (storeName.equals("NY")) {
            if (pizzaType.equals("cheese")) {
                pizza = new NYStyleCheesePizza();
            } else if (pizzaType.equals("peppernoni")) {
                pizza =  new NYStylePeppernoniPizza();
            } else if (pizzaType.equals("veggie")) {
                pizza =  new NYStyleVeggiePizza();
            } else {
                return null;
            }
        } else if(storeName.equals("Chicago")) {
            if (pizzaType.equals("cheese")) {
                pizza =  new ChicagoStyleCheesePizza();
            } else if (pizzaType.equals("peppernoni")) {
                pizza =  new ChicagoStylePeppernoniPizza();
            } else if (pizzaType.equals("veggie")) {
                pizza =  new ChicagoStyleVeggiePizza();
            } else {
                return null;
            }
        } else {
            System.out.println("invalid type of pizza");
            return null;
        }

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}
  • 개선 과정 및 코드
    • 디렉토리 구조
  • PizzaStore 팩토리 추상화
public abstract class PizzaStore {

    protected abstract Pizza createPizza(String type);

    public Pizza orderPizza(String type) {
        Pizza pizza;
        pizza = createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }
}
  • PizzaStore 팩토리 구현체
public class NYPizzaStore extends PizzaStore {

    @Override
    protected Pizza createPizza(String type) {
        if (type.equals("cheese")) {
            return new NYStyleCheesePizza();
        } else if (type.equals("peppernoni")) {
            return new NYStylePeppernoniPizza();
        } else if (type.equals("veggie")) {
            return new NYStyleVeggiePizza();
        } else {
            return null;
        }
    }
}
  • Pizza 팩토리 추상화
public abstract class Pizza {
    String name;
    String dough;
    String sauce;
    ArrayList toppings = new ArrayList();

    public void prepare() {
        System.out.println("Preparing " + name);
        System.out.println("Tossing dough~");
        System.out.println("Adding sauce");
        System.out.println("Adding toppings");
        for (int i = 0; i < toppings.size(); i++) {
            System.out.println(toppings.get(i));
        }
    }

    public void bake() {
        System.out.println("Bake for 25 minutes at 350");
    }

    public void cut() {
        System.out.println("Cutting the pizza into 8 slices");
    }

    public void box() {
        System.out.println("Place pizza in official PizzaStore box");
    }

    public String getName() {
        return name;
    }
}
  • Pizza 팩토리 구현체
public class NYStyleCheesePizza extends Pizza{
    public NYStyleCheesePizza() {
        name = "New York Cheese Pizza";
        dough = "Thin Curst Dough";
        sauce = "Marinara Sause";

        toppings.add("체다 치즈");
        toppings.add("파슬리");
    }
}

0개의 댓글