본문 바로가기
Computer Science/디자인패턴

Factory / Factory Abstract Method Pattern

by _S0_H2_ 2022. 9. 13.
728x90
반응형

Factory Method


팩토리 메소드 패턴은 객체를 생성할 때 필요한 인터페이스를 만든다. 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정한다.

- 예시로 살펴보자.
type에 따라 다른 pizza를 주문한다고 할 때 아래와 같이 작성할 수 있다.

하지만 type이 추가 될때마다 orderPizza에 대하여 수정이 필요할 것이다.
따라서, Pizza의 type에 따라 pizza를 만드는 부분을 객체 생성부분으로 캡슐화 한다.
createPizza를 PizzaFactory에서 만들도록 한다.

이 때, 지점마다 pizza style이 다르다면? 지점마다 factory를 생성하여 해당 객체를 PizzaStore로 넘겨준다.

이 때, PizzaFactory와 PizzaStore을 하나로 묶을 수 있는데, createPizza를 추상메소드로 선언하면 factoryMethod가 pizzaStore의 추상메소드로 변경되면서 다음과 같이 나타낼 수 있다.


최종적으로 아래와 같이 나타낼 수 있다.

createPizza를 abstract method로 선언해서 서브클래스가 객체를 생성하고 Pizza를 return 하여 특정 객체를 return한다.
여기서 PizzaStore를 생산자 클래스, Pizza를 제품 클래스로 볼 수 있다.

여기까지의 코드는 git에서!

Factory Abstract Method


하지만 객체 인스턴스를 직접 만들면 구상 클래스에 의존해야하기 때문에 이 의존성을 줄여야 한다. 의존성 뒤집기 원칙(Dependency Inversion Principle)은 고수준 구성 요소가 저수준 구성 요소에 의존하면 안 되며, 항상 추상화에 의존하게 만들어야 한다는 뜻을 의미한다. ( 고수준 구성요소는 다른 저수준 구성요소에 의해 정의되는 행동이 들어있는 구성요소를 의미함) 여기에서 PizzaStore는 고수준 구성 요소를, Pizza 객체는 저수준 구성 요소이다.

PizzaStore가 모든 종류의 pizza에 의존하고 있으므로 pizza라는 추상 클래스를 만들긴 했지만, 이 코드에서 구상 피자 객체를 생성하는 것이 아니기 때문에 추상화를 사용함에 따른 이점이 크게 없다. 따라서 orderPizza에서 인스턴스 만드는 부분을 뽑아서 아래와 같이 다이어그램을 변경한다.




여기에 추가로 지점마다 다른 원재료를 사용한다고 가정하고 원재료 팩토리를 만들어보자. 이 팩토리에서는 원재료군에 들어있는 각각의 원재료를 생산한다.(ex 반죽, 소스, 치즈 등) 다이어그램을 정리하면 아래와 같다.



코드는 git! (NYstore만 구현하였음)

728x90
반응형

'Computer Science > 디자인패턴' 카테고리의 다른 글

Command Pattern  (0) 2022.09.28
Singleton Pattern  (0) 2022.09.26
Decorator Pattern  (0) 2022.09.06
Observer Pattern  (0) 2022.08.30
Strategy Pattern  (0) 2022.08.24