팩토리 메소드 패턴

Factory Method Pattern
(팩토리 메소드 패턴)

생성 패턴(Object Creational)

호출시에 적절한 객체를 반환하는 메소드

객체 생성 목적의 인터페이스 또는 추상 클래스를 정의하고
객체 생성의 책임을 구체화하는 하위 클래스로 넘긴다

Class diagram

클래스_다이어그램

예시

// 생성될 객체의 추상 클래스
public abstract class Pizza {
    // 구현체가 구현해야될 기능
    public abstract void addIngredients();

    // 공통된 기능
    public void bakePizza() {
        System.out.println("Pizza baked at 400 for 20 minutes.");
    }
}

// 구현체 - Cheese 피자
public class CheesePizza extends Pizza {
    @Override
    public void addIngredients() {
        System.out.println("Preparing ingredients for cheese pizza.");
    }
}

// 구현체 - Pepperoni 피자
public class PepperoniPizza extends Pizza {
    @Override
    public void addIngredients() {
        System.out.println("Preparing ingredients for pepperoni pizza.");
    }
}

// 구현체 - Veggie 피자
public class VeggiePizza extends Pizza {
    @Override
    public void addIngredients() {
        System.out.println("Preparing ingredients for veggie pizza.");
    }
}
// 객체 생성 인터페이스를 제공하는 추상 클래스
public abstract class BasePizzaFactory {
    
    public abstract Pizza createPizza(String type);
}

// 적합한 객체를 생성하는 구현체
public class PizzaFactory extends BasePizzaFactory{
    @Override
    public  Pizza createPizza(String type){
        Pizza pizza;
        switch (type.toLowerCase())
        {
            case "cheese":
                pizza = new CheesePizza();
                break;
            case "pepperoni":
                pizza = new PepperoniPizza();
                break;
            case "veggie":
                pizza = new VeggiePizza();
                break;
            default: throw new IllegalArgumentException("No such pizza.");
        }
        pizza.addIngredients();
        pizza.bakePizza();
        return pizza;
    }
}

테스트

public class PizzaFactoryTest {
    @Test
    public void testMakePizzas(){
        BasePizzaFactory pizzaFactory = new PizzaFactory();
        Pizza cheesePizza = pizzaFactory.createPizza("cheese");
        // Preparing ingredients for cheese pizza.
        // Pizza baked at 400 for 20 minutes.
        Pizza veggiePizza = pizzaFactory.createPizza("veggie");
        // Preparing ingredients for veggie pizza.
        // Pizza baked at 400 for 20 minutes.
    }
}

추상 팩토리 패턴과의 차이

팩토리 메소드는 호출시에 적절한 객체를 반환하는 메소드이고

생산 제품군 전체를 마치 테마를 바꾸듯 간단하게 교체하기위해
공통 테마의 팩토리 메소드들을 가지는 객체를 주입할 수 있도록
추상적으로 정의한 것이 추상 팩토리다

댓글남기기