객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 하는 패턴
➡️ 하위 클래스에서 팩토리 메소드를 오버라이딩해서 객체를 반환하는 패턴
Product
ConcreteProduct
Creator
ConcreteCreator
팩토리 메소드 패턴의 구현 방법은 2가지가 있다.
팩토리 메소드의 인자를 통해 다양한 Product를 생성하게 한다.
// Product
interface Pizza {
void prepare();
void bake();
void box();
}
// ConcreteProduct
class NYStyleCheesePizza implements Pizza { ... }
class NYStylePepperoniPizza implements Pizza { ... }
// Creator
abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type); // factory method
pizza.prepare();
pizza.bake();
pizza.box();
return pizza;
}
// factory method
abstract Pizza createPizza(String type);
}
// ConcreteCreator
class NYPizzaStore extends PizzaStore {
@Override
Pizza createPizza(String type) {
if ("cheese".equals(type)) {
return new NYStyleCheesePizza();
} else if ("pepperoni".equals(type)) {
return new NYStylePepperoniPizza();
}
return null;
}
// ConcreteCreator
class ChicagoPizzaStore extends PizzaStore {
@Override
Pizza createPizza(String type) {
if ("cheese".equals(type)) {
return new ChicagoStyleCheesePizza();
} else if ("pepperoni".equals(type)) {
return new ChicagoStylePepperoniPizza();
}
return null;
}
}
PizzaStore nyStore = new NYPizzaStore();
PizzaStore chicagoStore = new ChicagoPizzaStore();
Pizza pizza = nyStore.orderPizza("cheese");
Pizza pizza1 = chicagoStore.orderPizza("pepperoni");
// RobotFactory 클래스 생성
public abstract class RobotFactory {
abstract Robot createRobot(String name);
}
// SuperRobotFactory 클래스 생성
public class SuperRobotFactory extends RobotFactory {
@Override
Robot createRobot(String name) {
switch(name) {
case "super" :
return new SuperRobot();
case "power" :
return new PowerRobot();
}
return null;
}
}
➡️ 생성하는 객체를 별도로 두고 객체에 넘어오는 값에 따라서 다른 로봇(피자)를 만듦
[참고 자료]