[디자인 모델] 의 공장 방법 (Factory Method)

공장 방법 이 든 추상 적 인 공장 이 든 공장 이란 생산 용 이 고 공장 방법의 역할 은 바로 생산 대상 이다.
공장 방법의 정 의 는 창설 대상 을 위해 인 터 페 이 스 를 정의 하지만 하위 클래스 가 어떤 클래스 를 실례 화 할 지 결정 하도록 한다.공장 방법 은 하나의 종 류 를 하위 류 로 예화 시 켰 다.
영어 정의: define an interface for creating an object, but let subclasses decider which class to instantiate. Factory Method lets a class defter instantiation to subclasses.
'Header First' 는 OO 디자인 의 원칙 인 - Depend Upon abstractions. Do not depend upon concrete classes 를 소개 합 니 다. 'GOF' 에서 비슷 한 표현 을 찾 을 수 있 습 니 다. Frameworks use abstract classes to define and maintained relationships between objects. 공장 방법 은 추상 과 실현 을 분리 시 켜 클 라 이언 트 가 대상 의 구체 적 인 실현 에 관심 을 가지 지 않 아 도 된다 는 것 을 알 수 있 습 니 다.상대 가 만 나 는 관계 에 만 관심 을 가 져 야 한다.
추상 공장 의 구조 도 는 다음 과 같다.
만약 에 아버지 류 중의 공장 방법 이 내용 을 실현 하지 못 하면 템 플 릿 방법 (template method) 의 디자인 모델 을 사 용 했 고 실현 내용 이 있 으 면 공장 방법 은 기본 대상 을 만 드 는 방법 을 제공 하여 공장 방법의 유연성 을 증가 시 켰 고 자 류 는 override 가 필요 하지 않 을 수 있다.
평행 계승 구조 에서 공장 방법 은 두 개의 계승 체 계 를 연결 하 는 역할 을 할 수 있다.
공장 방법 에서 lazy initialization 을 사용 할 수 있 습 니 다.
공장 방법 은 매우 광범 위 하 게 사용 되 어야 한다. 아래 에 제 시 된 예시 코드 는 < Header First > 에서 나온다.
public abstract class PizzaStore {
    public Pizza orderPizza(String type) {
        Pizza pizza;

        pizza = createPizza(type);
        
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

    protected abstract Pizza createPizza(String type);
}

public class NYPizzaStore extends PizzaStore {
    public Pizza createPizza(String type) {
        if (type.equals("cheese")) {
            return new NYStyleCheesePizza();
        }
        return null;
    }
}

public class ChicagoPizzaStore extends PizzaStore  {
    protected Pizza createPizza(String type) {
        if (type.equals("cheese")) {
            return new ChicagoStyleCheesePizza();
        }
        return null;
    }
}
import java.util.ArrayList;
public abstract class Pizza {
    String name;
    String dough;
    String sauce;
    ArrayList<String> toppings = new ArrayList<String>();

    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));
        }
    }

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

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

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

    public String getName() {
        return name;
    }
}

public class NYStyleCheesePizza extends Pizza {
    public NYStyleCheesePizza() {
        name = "NY Style Sause and Cheese Pizza";
        dough = "Thin Crust Dough";
        sauce = "Marinara Sauce";
        toppings.add("Grated Reggiano Cheese");
    }
}


public class ChicagoStyleCheesePizza extends Pizza {
    public ChicagoStyleCheesePizza() {
        name = "Chicago Style Deep Dish Cheese Pizza";
        dough = "Extra Thick Crust Dough";
        sauce = "Plum Tomato Sauce";
        toppings.add("Shredded Mozzarella Cheese");
    }

    void cut() {
        System.out.println("Cutting the pizza into square slices");
    }
}
import java.util.ArrayList;
public abstract class Pizza {
    String name;
    String dough;
    String sauce;
    ArrayList<String> toppings = new ArrayList<String>();

    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));
        }
    }

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

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

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

    public String getName() {
        return name;
    }
}

factory method 와 abstract factory 의 차 이 는 factory method 는 한 제품 만 생산 하고 abstract factory 는 families of products 를 생산 합 니 다.
abstract factory 는 제품 이 집 중 된 모든 제품 을 생산 할 때 factory method 를 사용 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기