팩토리 메소드 패턴의 기조인 '심플 팩토리'를 먼저 학습하면 이해가 쉽다.
https://flower0.tistory.com/414
팩토리 메소드 패턴 Factory Method Pattern
[개념] 팩토리 메소드 패턴이란?
객체를 생성해내는 공장을 '인스턴스화'하여, 어떤 객체를 생성할지는 서브클래스에게 맡기는 방법이다.
'Simple factory'에서 본 PizzaStore를 예로 들어보자.
PizzaStore 내부에 객체 생성만을 처리하는 createPizza()메소드를 추상 메소드로 선언한다. ->인스턴스화
그리고 PizzaStore를 상속받은 NYPizzaStore과 ChicagoPizzaStore에서 createPizza()메소드를 구현하며, 직접 필요한 객체를 생성한다. ->서브클래스에서 어떤 객체를 생성할지 결정한다.
위와 같이 팩토리 메소드 패턴을 이용하면, 피자를 만드는 활동(prepare, bake, cut, box)은 전부 PizzaStore에 국한시키면서도 분점(NYPizzaStore, ChicagoPizzaStore)마다 고유 스타일의 피자를 생성할 수 있다.
다시 정리하면, 피자 가게와 피자 제작 과정 전체를 하나로 묶어주는 프레임 워크를 만들었음에도 불구하고, 유연성도 잃지 않았다.
// PizzaStore
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza(type); // 팩토리 객체가 아닌 Pizza store에 있는 createPizza를 호출함
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
abstract Pizza createPizza(String type); // 팩토리 메소드
}
Pizza생성은 서브클래스의 createPizza()를 통해서 진행되고, 나머지 피자 제작 과정은 PizzStore에서 처리한다.
// NYPizzaStore
public class NYPizzaStore extends PizzaStore {
Pizza createPizza(String item) {
if( item.equals("cheese") )
return new NYStyleCheesePizza();
else if( item.equals("pepperoni") )
return new NYStylePepperoniPizza();
else if( item.equals("clam") )
return new NYStyleClamPizza();
else
return null;
}
}
PizzaStore의 서브클래스인 NYPizzaStore에서 뉴욕스타일에 맞는 피자 객체를 생성할 수 있다.
(ChicagoPizzaStore의 코드는 NYPizzaStore와 동일하기 때문에 생략하였다.)
Simple Factory와 Factory Method pattern의 차이점
- Simple factory :
객체 생성만 처리하는 공장(클래스)을 별도로 둔다.
- Factory Method Pattern :
객체를 생성하는 부분을 인스턴스화하여, 서브 클래스에서 직접 객체를 만들 수 있게 한다.
(객체 생성만 처리하는 추상 method를 둔다.)
심플 팩토리와 비교하자면, 생성하는 제품을 서브클래스에서 마음대로 변경할 수 있다는 큰 유연성을 주고 있다.
[장점] Factory Method Pattern 사용의 장점
가장 큰 부분은 제품을 생산하는 부분과 사용하는 부분을 분리시킬 수 있다는 점이다.
(다시 말해, Creator 클래스가 ConcreteProduct와 느슨하게 결합되어 있다.)
따라서 다른 제품을 추가하거나 제품 구성을 변경시키더라도 제품을 생산하는 부분(Creator)은 건드릴 필요가 없다.
-> 결론은 유연성과 확장성이 뛰어남
나아가 추상팩토리패턴에 대해 공부하려면 아래 링크에 정리해두었다.
https://flower0.tistory.com/416