소프트웨어 관련/Design Pattern

[Design Pattern] Abstract Factory Pattern

JJangGu 2022. 5. 10. 22:15

이전 글에 이어서 팩토리 패턴 중 추상 팩토리 패턴에 대해서 학습하겠습니다. 

 

Abstract Factory Pattern

추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성한다.

 

팩토리 메소드 패턴을 공부하면서 피자가게 예를 들었었는데요, 추상 팩토리 패턴을 이해하기 위해서 같은 예시로 이어가보겠습니다. 이제는 원재료의 품질을 관리하고 싶다는 요구사항이 들어왔습니다. 근데 뉴욕 스타일과 시카고 스타일의 재료는 또 다르겠죠. 이런 것들을 어떻게 해결 할 수 있을지 보겠습니다. 

 

 

좀 복잡한 모양이 되었습니다. 이 다이어그램에 대해서 설명을 해보면 PizzaIngredientFactory 는 서로 관련된 제품군을 만드는 방법을 정의하기 위한 인터페이스 입니다. NYPizzaIngredientFactory와 ChicagoPizzaIngredientFactory 이 두개의 구상 피자 팩토리에서는 원재료를 만드는 일을 하죠. 각 팩토리는 자기 지역에 맞는 재료 객체를 만드는 법을 알고 있습니다. 

 

Dough, Sauce 등 인터페이스로 원재료의 틀을 정하고, 각 재료의 구상 클래스를 둔 후에 재료 공장에서 각 지역에 맞는 재료를 만들어 낸다고 보면 되겠습니다. 

 

다시 클래스 다이어그램으로 구조를 그리자면, 

 

 

이런 모양이 됩니다. AbstractFactory 는 모든 구상 팩토리에서 구현해야 하는 인터페이스이고, 제품을 생산하기 위한 메소드들이 정의되어 있습니다. 구상 팩토리에서는 서로 다른 제품군을 구현하고, 클라이언트에서 제품이 필요하면 팩토리에서 적절한 걸 골라서 쓰게 됩니다. 

 

Client 를 만들때도 추상 팩토리를 바탕으로 만들어 실제 팩토리는 실행시에 결정되게 합니다. 위의 피자가게를 예를 들면, NYPizzaStore 로 만든것이죠. 

 

그러면 앞에서 봤었던 팩토리 메소드 패턴과 어떤 차이가 있을까요? 🤔

 

먼저 제품을 만드는 방식의 차이를 보겠습니다. 팩토리 메소드 패턴은 상속을 통해서 객체를 만듭니다. 반면, 추상 팩토리 패턴은 객체 구성을 통해서 만듭니다. 그래서 팩토리 메소드 패턴을 통해서 객체를 만들때는 클래스를 확장하고 팩토리 메소드를 오버라이드 해야합니다. 

 

추상 팩토리 패턴은 제품군을 만들기 위한 추상 형식을 제공하고, 객체를 만드는 방법은 서브클래스에서 정의됩니다. 팩토리를 이용하고 싶으면 일단 인스턴스를 만들고 추상 형식을 써서 만든 코드에 전달하면 되죠. 

 

소스코드는 깃허브 주소를 첨부하는 것으로 보여드리겠습니다. 

 

https://github.com/KyungSik9870/DesignPattern/tree/master/src/study/pattern/factory

 

GitHub - KyungSik9870/DesignPattern: Design Patterns - Head First 의 Design Pattern 의 예제를 기준으로 디자인 패턴

Design Patterns - Head First 의 Design Pattern 의 예제를 기준으로 디자인 패턴 학습 - GitHub - KyungSik9870/DesignPattern: Design Patterns - Head First 의 Design Pattern 의 예제를 기준으로 디자인 패턴 학습

github.com