책너두 (헤드 퍼스트 디자인 패턴) 12일차 (~179p)

요약

  • 객체지향 빵 굽기 : 팩토리 패턴
    • 병렬 클래스 계층 구조 알아보기
    • 팩토리 메소드 패턴의 정의
      • 객체 의존성 살펴보기
      • 의존성 뒤집기 원칙
      • 의존성 뒤집기 원칙 적용하기
      • 의존성 뒤집기 원칙을 지키는 방법
    • 원재료 종류 알아보기
      • 원재료군으로 묶기

메모

병렬 클래스 계층 구조 알아보기

  • 생산자 클래스와 거기에 대응되는 제품 클래스는 병렬 계층구조로 볼 수 있음.
    • 둘다 추상 클래스로 시작하고, 그 클래스를 확장하는 구상 클래스들이 지점과, 피자를 만드는 구체적인 구현을 담당함.

팩토리 메소드 패턴의 정의

📍 팩토리 메소드 패턴(Factory Method Pattern) : 객체를 생성할 때 필요한 인터페이스를 만듦. 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정함. 팩토리 메소드 패턴을 사용하면 클래스 인스턴스 만드는 일을 서브클래스에 맡기게 됨.

객체 의존성 살펴보기

  • 심하게 의존적인 PizzaStore 의존성은 다음과 같음.
  • PizzaStore
    • NYStyleCheesePizza
    • NYStyleVeggiePizza
    • NYStylePepperoniPizza
    • NYStyleClamPizza
    • ChicagoStyleCheesePizza
    • ChicagoStyleVeggiePizza
    • ChicagoStylePepperoniPizza
    • ChicagoStyleClamPizza

의존성 뒤집기 원칙

  • 구상 클래스 의존성을 줄이는게 좋음.
    • 의존성 뒤집기 원칙(Dependency Inversion Principle)
📍 디자인 원칙 : 추상화된 것에 의존하게 만들고 구상 클래스에 의존하지 않게 만든다.
  • 이 디자인 원칙은 “구현보다는 인터페이스에 맞춰서 프로그래밍한다” 원칙과 똑같다고 생각할 수 있음.
    • 물론 비슷하지만, 의존성 뒤집기 원칙에서는 추상화를 더 많이 강조함.
    • 고수준 구성 요소가 저수준 구성 요소에 의존하면 안 되며, 항상 추상화에 의존하게 만들어야 한다는 뜻을 담음.
      • ex) 고수준 구성 요소 : PizzaStore → 피자스토어의 행동은 피자에 의해 정의됨.
      • 저수준 구성 요소 : Pizza

의존성 뒤집기 원칙 적용하기

  • 심하게 의존적인 PizzaStore 의 가장 큰 문제는 PizzaStore 가 모든 종류의 피자에 의존하는 점임.
  • 팩토리 메소드 패턴을 적용하면 고수준 구성 요소인 PizzaStore와 저수준 구성 요소인 피자객체 모두 추상 클래스인 Pizza에 의존하게 됨.
    • 팩토리 메소드 패턴이 의존성 뒤집기 원칙을 준수하는 유일한 방법은 아니지만, 적합한 방법 중 하나임.
  • 왜 의존성 “뒤집기” 인가?
    • 객체지향 디자인을 할 때, 일반적으로 생각하는 방법과 반대로 뒤집어서 생각해야하기 때문
    • 저수준 구성 요소(피자 구상 클래스)가 고수준 추상 클래스(Pizza)에 의존함.
    • 의존성이 위에서 아래로만 내려가던 걸 반대로 뒤집음.

의존성 뒤집기 원칙을 지키는 방법

  • 다음 가이드 라인을 따르면 의존성 뒤집기 원칙에 위배되는 객체지향 디자인을 피하는데 도움이 됨.
    • 변수에 구상 클래스의 레퍼런스를 저장하지 말자.
      • 팩토리를 써서 구상 클래스의 레퍼런스 변수에 저장하는 일을 미리 방지하자.
    • 구상 클래스에서 유도된 클래스를 만들지 말자.
      • 이 유도된 클래스를 만들면 특정 구상 클래스에 의존하게 됨.
      • 인터페이스나 추상 클래스처럼 추상화된 것으로 부터 클래스를 만들어야 함.
    • 베이스 클래스에 이미 구현되어 있는 메소드를 오버라이드 하지 말자.
      • 이미 구현되어 있는 메소드를 오버라이드 하면 베이스 클래스가 제대로 추상화 되지 않음.
      • 즉, 베이스 클래스에서 메소드를 정의할 때는 모든 서브클래스에서 공유할 수 있는 것만 정의해야 함.
  • 물론 이 원칙을 완벽히 지킬 수 있는건 아님.
    • 이 가이드라인을 완벽히 습득한 상태에서 디자인 하면 원칙을 지키지 않은 부분을 명확히 파악할 수 있고, 합리적인 상황에서 불가피한 상황에서만 예외를 둘 수 있음.

원재료 종류 알아보기

  • 만약, 특정 지점에서 자잘한 재료를 더 싼 재료로 바꿔서 마진을 높이고 있다면?
  • 원재료 품질 관리가 필요함.
    • 지점 마다 거리가 있기 때문에 원재료 생산 공장을 만들어도 각 지점까지 재료 배달하기 어려움.
    • 또, 지점 마다 사용하는 소스가 다를 수도 있음.
    • 즉, 각 지점마다 각기 다른 소스를 배달해야 함.

원재료군으로 묶기

  • 각 지점마다 사용하는 재료가 다름.
    • 서로 다른 재료를 제공하려면 원재료군(families of ingredients)을 처리할 방법을 생각해야 함.
    • 특정 재료로 구성된 군을 각 지역마다 구현해야 함.

댓글

Designed by JB FACTORY