Computer Science/Design Pattern
[디자인 패턴] 12. 팩토리 메서드 패턴 (Factory Method Design Pattern)
KeyDi
2022. 12. 20. 01:06
728x90
학습목표 : 1) 적합한 클래스의 객체를 생성하는 코드의 캡슐화 방법 이해, 2) 팩토리 메서드 패턴 이용 객체 생성 방법 이해
팩토리 메서드 패턴 (Factory Method Pattern)
객체의 생성 코드를 별도의 클래스/메서드로 분리함으로써 객체 생성 방식의 변화를 대비하는데 유용한 패턴이다.
즉, 조건에 따른 객체 생성을 팩토리 클래스로 위임하여, 팩토리 클래스에서 객체를 생성하는 패턴이다.
조건에 따라 동적으로 객체가 선택되어 생성하는 경우, 코드의 빈번한 수정이 발생하게 된다.
이에 팩토리 메서드 패턴을 이용하여 객체를 생성하는 부분을 캡슐화한다.
팩토리 메서드 패턴 실습
- new : 구상 클래스의 instance가 만들어짐
- 구상 클래스에서 여러 new 연산자 사용하여 instance 여러 개 존재할 경우, 코드 변경/확장에 빈번한 코드 수정이 발생하게 된다. (OCP 위반)
파자 가게
- 피자가게에서 여러 피자 존재 (치즈피자, 페페로니 피자, 그리스피자 등등..) : 여러 종류의 피자 클래스 필요
PizzaStore
public class PizzaStore {
SimplePizzaFactory factory;
//생성자에 팩토리에서 생성된 객체를 인자로 받아 해당 객체를 생성함
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String pizza_type) {
Pizza pizza;
// 인스턴스 객체 생성을 팩토리에 위임하여 생성
pizza = factory.createPizza(pizza_type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
SimplePizzaFactory
public class SimplePizzaFactory {
//피자 인스턴스를 생성하고 해당 객체를 리턴하는 메소드
public Pizza createPizza(String pizza_type) {
Pizza pizza = null;
if (pizza_type.equals("cheese")) {
pizza = new CheesePizza();
}
else if (pizza_type.equals("pepperoni")) {
pizza = new PepperoniPizza();
}
return pizza;
}
}
Pizza
public abstract class Pizza {
String pizza_name;
public void prepare() {
System.out.println("도우, 소스, 토핑을 하는중..");
}
public void bake() {
System.out.println("화덕에서 피자를 굽습니다..");
}
public void cut() {
System.out.println("피자를 자릅니다..");
}
public void box() {
System.out.println("상자에 피자를 담습니다..");
}
public String getName() {
return pizza_name;
}
}
CheesePizza
public class CheesePizza extends Pizza {
public CheesePizza() {
pizza_name = "치즈 피자";
}
}
PepperoniPizza
public class PepperoniPizza extends Pizza {
public PepperoniPizza() {
pizza_name = "페페로니 피자";
}
}
PizzaTest
public class PizzaTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
SimplePizzaFactory factory = new SimplePizzaFactory();
PizzaStore store = new PizzaStore(factory);
Pizza pizza1 = store.orderPizza("cheese");
Pizza pizza2 = store.orderPizza("pepperoni");
System.out.println(pizza1.getName());
System.out.println(pizza2.getName());
}
}
팩토리 메소드 패턴을 이용하여 구상 클래스(피자)의 변경에 대한 객체 생성 방식에 유연한 대비가 가능하게 되었다.
728x90
반응형