프로그래밍 연습하기

팩토리 패턴 본문

디자인 패턴

팩토리 패턴

john.k 2020. 8. 6. 13:13
반응형

new를 사용하게 되면 구상 클래스의 인스턴스를 만들게 됩니다.

구상 클래스를 많이 사용하게 되면 구상 클래스를 추가할 때 마다 코드를 고쳐야 해서

많은 문제가 생기게 됩니다. 이런 경우를 변화에 닫혀있다라고 하고,

OCP(Open/Closed Principle)을 어기게 됩니다.

 

따라서 객체를 생성하는 부분을 팩토리라고 이름 붙인 클래스로 따로 분리하게 됩니다.

하지만 이러한 Simple Factory는 디자인 패턴이라고 할 수는 없습니다.

단지 클라이언트와 구상 클래스를 분리하기 위한 간단한 기법으로 활용될 수 있습니다.

 

추상 클래스를 만들어 객체를 생성하는 메소드를 추상 메소드로 선언해둡니다.

여기서 나온 서브클래스들이 객체를 생성하는 추상 메소드를 필요에 맞게 구현하게 됩니다.

이것이 팩토리 메소드 패턴입니다.

 

구상 클래스에 심하게 의존적인 클래스가 있습니다.

어떤 것을 추가하려면 추가해야 되는 객체는 더 많아지고 복잡하게 됩니다.

그래서 구상 클래스에 대한 의존성을 줄여야 하는데,

그것이 DIP(Dependency Inversion Principle)입니다.

구상 클래스처럼 구체적인 것이 아니라 추상 클래스나 인터페이스처럼

추상적인 것에 의존하는 코드를 만들어야 합니다.

팩토리 메소드 패턴도 사용할 수 있지만, 다른 방법도 있습니다.

 

다음은 DIP를 지키는 데 도움이 될 만한 원칙입니다.

  • 어떤 변수에도 구상 클래스에 대한 레퍼런스를 저장하지 마라.(new를 사용하고 변수에 저장)
  • 구상 클래스에서 유도된 클래스를 만들지 마라.
  • 베이스 클래스의 메소드를 오버라이드 하지 마라. (오버라이드가 필요하다면 애초에 베이스 클래스 추상화가 부족한 것)

이러한 가이드라인을 완벽하게 지킬 수는 없지만, 지향해야 합니다.

 

이 책에서는 추상 팩토리 패턴의 예시를 피자로 들었습니다.

피자가게에서 다양한 피자를 생성 (피자 구상 클래스들 생성) 하는 것이 아닌,

추상화된 피자를 만들고 그 피자에 들어가는 재료들을 생성하는 것을 인터페이스로 구현하여서,

그 인터페이스를 구현한 특정 피자 재료 팩토리를 만들어서 사용합니다.

어떤 피자를 만드는데 먼저 추상화된 피자 클래스를 상속받고 재료는 재료 팩토리에서 생성하는 것을 사용합니다.

그리고 각 피자 분점 가게에서는 분점에 맞는 재료 팩토리를 구현한 것을 이용해 재료 팩토리를 만들고,

피자 종류에 맞게 피자를 생성합니다. 재료는 재료팩토리를 전달하여 피자 클래스에서는 그것을 이용하여 각 피자 종류에 맞는 재료를 생성합니다. 

 

정리하면 추상 팩토리 패턴이란 서로 연관되거나 의존적인 객체들로 이루어진 제품군을 생성하기 위한 인터페이스를 제공합니다. 구상 클래스는 서브 클래스에 의해 만들어지게 됩니다.

 

참고 자료 - Head First Design Pattern

반응형
Comments