팩토리 패턴 Factory Pattern

팩토리 패턴

  • 구체적으로 어떤 인스턴스를 만들지는 서브 클래스가 정한다.
  • 다양한 구현체 (Product)가 있고, 그중에서 특정한 구현체를 만들 수 있는 다양한 팩토리 (Creator)를 제공할 수 있다.

  • 아래는 Head First Design Patterns의 예제로 Pizza 객체의 생성을 SimplePizzaFactory에 대리하는 것을 확인할 수 있다.

image

  • 팩터리는 유일한 구현체를 리턴할 수도 있지만, 여러 구현체 중 하나를 선택할 수 있다. 특정 객체를 가리킬 수 있는 값을 인자로 삽입하며 해당 객체를 꺼낸다. 아래의 예제는 문자열로 생성할 객체를 결정한다. “Veggie”를 값으로 VeggiePizza를 리턴한다.

image

추상 팩터리 패턴

  • 팩터리 패턴이 한 종류의 타입만을 제공하는 것과 달리 추상 팩터리 패턴은 객체 군을 제공한다.
  • 특히 parts와 ingredients 등 하나의 구성체를 구성하기 위한 부분의 집합을 제공한다. 팩터리 내부에는 다수의 메서드가 구현되어 있다. 각 메서드 마다 서로 다른 데이터 타입을 리턴한다. 데이터 타입은 특정 객체를 생성하기 위한 부품으로 사용된다.

  • 지역에 따라 피자를 만들 때 사용하는 재료가 다르다. 현재 예제에서는 뉴옥 스타일과 시카코 스타일, 캘리포니아 스타일로 구분한다.

image

  • 피자 객체를 더 이상 YNStyleCheesePizza와 ChicagoCheesePizza로 복잡하게 구현하지 않는다. CheesePizza만 존재하고 구체적인 재료는 PizzaIngredientFactory에 대리한다. PizzaIngredientFactory는 뉴욕, 시카코, 캘리포니아 스타일로 구현된다. 원하는 구현체를 피자에 주입한다.

image

OCP, DI, IoC

  • 팩터리 패턴은 OCP를 설명하는데 적합한 디자인 패턴이다. 구체적인 인스턴스를 서브 클래스가 정한다는 의미는, 서브 클래스를 통해 다양한 형태로 확장 가능함을 의미한다. PizzaIngredientFactory의 구현체에 따라 뉴욕 스타일의 피자가 되거나 캘리포니아 스타일의 피자가 된다.
  • 외부 인자의 주입으로 객체가 구성된다. IoC와 DI를 통해 객체가 구성된다.

정적 팩터리 메서드 static factory method

  • 팩터리 메서드와 정적 팩터리 메서드는 유사한 업무를 수행한다.
  • 정적 팩터리 메서드의 경우 (대체로) 생성자를 private으로 두고, 정적 메서드로 인스턴스를 리턴하는 한다.
  • 정적 팩터리 메서드를 외부로 꺼낼 경우 팩터리가 된다.

참조

  • 백기선, 디자인 패턴 강의(https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4)
  • O’Reilly, “헤드 퍼스트 디자인 패턴”