이번 Factory Method 패턴은 앞서 올린 Template Method 패턴을 적용한 패턴입니다!
즉, 인스턴스를 생성하는 것에 Template Method 패턴을 적용한 것이 Factory Method 패턴이라고 할 수 있습니다!
그러면, 차근차근히 Factory Method 패턴 다이어그램과 Template Method 패턴 다이어그램을 비교해보면서 어떠한 패턴인지 자세하게 살펴보겠습니다.
첫 번째 그림이 Template Method 패턴 다이어그램이고, 두 번째 그림은 Factory Method 패턴 다이어그램입니다.
먼저, 공통점에 대해서 살펴보겠습니다.
Creator는 Abstract Class이고, ConcreteCreator는 ConcreteClass인데요!
그러면, ConcreteCreator에는 없고 Creator(부모)에만 있는 메소드는 create 메소드가 바로 templateMethod가 됩니다.
따라서, create 메소드에는 factoryMethod 관련 동작의 흐름이 정의되어 있고, ConcreteCreator가 factoryMethod를 구현하게 됩니다.
☝️ 여기에서 가장 다른 점은 Product 클래스와 ConcreteProduct 클래스가 있다는 점인데요!
Creator가 Product를 'create ➡️'로 향하고 있는 화살표를 볼 수 있습니다.
즉, Creator가 Product를 생성한다(인스턴스를 생성)고 볼 수 있습니다.
하지만, 추상 클래스(Creator)가 어떻게 생성할 수 있을까요??
바로! Creator의 리턴 값이 Product이기 때문입니다.
public abstract class Creator {
//Template Method => 팩토리 메서드 패턴인 경우, 가장 먼저 봐야할 메소드
public final Product create(String x){
Product p = factoryMethod(x);
return p;
}
//Factory method
protected abstract Product factoryMethod(String x);
}
public abstract class Product {
public abstract void method1();
public abstract void method2();
}
즉, Creator가 Product를 생성하고, 이러한 추상 클래스들을 실제로 구현하는 것이 ConcreteCreator와 ConcreteProduct입니다.
🚨 만약에 Factory Method 패턴과 Factory Method 패턴을 사용한 프로젝트라면, Template Method를 살펴보면 해당 패턴의 동작 흐름을 쉽게 이해할 수 있으므로 Template Method를 가장 먼저 살펴보는 것이 좋습니다!!
그러면 단순하게 하나의 클래스를 생성해서 인스턴스를 만들면 되는데, 왜 힘들게 이러한 패턴을 사용할까요??
Main 클래스를 살펴보면, 쉽게 알 수 있습니다!
import framework.Factory;
import framework.Product;
import bicycle.BicycleFactory;
public class Main {
public static void main(String[] args) {
Factory factory = new BicycleFactory();
Product bicycle1 = factory.create("Blue");
Product bicycle2 = factory.create("White");
bicycle1.use();
bicycle2.use();
}
}
사용하는 이유 1) Client는 자유도가 낮아지고, 사용성은 쉬워집니다.
사용하는 이유 2) 정보 노출의 제약을 유연하게 가져갈 수 있습니다.
팩토리 메소드 패턴은 조직이 3개라고 볼 수 있습니다.
즉, 책임을 분배하고, 정보의 노출을 제약하면서 개발을 진행할 수 있습니다.
🚨 조직이 크지 않다면, Factory Method 패턴을 사용하지 않는 것이 좋습니다.
- 조직의 분업(혼자)이 없다면, 오히려 복잡한 공정만 만들어질 수 있습니다.
- 혼자할 때, Factory Method 패턴은 오버 헤드가 될 수 있습니다.
Factory Method 패턴 다이어그램에서 프레임워크라는 단어를 볼 수 있었습니다!
그러면 프레임워크가 무엇이길래 여기에서 사용되었을까요??
대표적으로 Spring은 프레임 워크입니다!
따라서 프레임 워크는 라이프 사이클을 관리해주는 것이라고도 할 수 있습니다.
즉, 생성 과정의 라이프 사이클이나, 해지 과정의 라이프 사이클을 관리해줍니다.
Factory Method 패턴 다이어그램에서 프레임워크도 Product의 생성과정을 관리해주기 때문에 프레임워크라고 정의되어 있다고 이야기할 수 있습니다!
잘봤습니다. 좋은 글 감사합니다.