Published on

디자인 패턴

Authors
  • avatar
    Name
    JaeHyeok CHOI
    Twitter
    none

디자인 패턴의 역사

패턴의 분류

  • 생성 패턴 : 기존 코드의 재활용과 유연성을 증가시키는 객체 생성 메커니즘들을 제공한다.
  • 구조 패턴 : 구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법
  • 행동 패턴 : 객체 간의 효과적인 의사소통과 책임 할당을 처리한다.

생성 디자인 패턴

  • 팩토리 메서드 패턴

    부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴.

    문제

    물류 관리 앱을 개발하고 있다고 할때, 첫 번째 버전은 트럭 운송만 처리할 수 있어서 대부분의 코드가 Truck 클래스에 있었다. 얼마 후 해상 물류 기능을 앱에 추가해 달라고 하여 코드를 전부 수정해야만 한다. Ship 클래스를 추가하려면 전체 코드 베이스를 변경해야 한다. 이렇게 되면 조건문이 운송 수단 객체들의 클래스에 따라 앱의 행동을 바꾸는 매우 복잡한 코드가 되게 된다.

    해결

    팩토리 메서드 패턴은 객체 생성 직접 호출들을 특별한 팩토리 메서드에 대한 호출들로 대체하는 것을 제안한다. 객체들은 new 연산자를 통해 생성되지만 팩토리 메서드 내에서 호출된다.

    자식 클래스들은 팩토리 메서드가 반환하는 객체들의 클래스를 변경한다.

    자식 클래스에서 팩토리 메서드를 오버라이딩하고 그 메서드에 의해 생성되는 제품들의 클래스를 변경할 수 있게 된다.

    제한사항

    자식 클래스들은 다른 유형의 제품들을 해당 제품들이 공통 기초 클래스 혹은 공통 인터페이스가 있는 경우에만 반환할 수 있다. 예를 들어 Truck과 Ship 클래스 모두 Transport 인터페이스를 구현해야하고, deliver 메서드를 오버라이드 한다. 그러나 각 클래스는 이 메서드를 다르게 구현하게 된다.

    구조

    1. 제품은 인터페이스를 선언한다. 인터페이스는 생성자와 자식 클래스들이 생성할 수 있는 모든 객체에 공통 된다.
    2. 구상 제품들은 제품 인터페이스의 다양한 구현들이다.
    3. 크리에이터 클래스는 새로운 제품 객체들을 반환하는 팩토리 메서드를 선언한다.
    4. 구상 크리에이터들은 기초 팩토리 메서드를 오버라이드하여 다른 유형의 제품을 반환하게 하도록 한다.

    *팩토리 메서드는 항상 새로운 인스턴스들을 생성해야 할 필요가 없다. 팩토리 메서드는 기존 객체들을 캐시, 객체 풀 또는 다른 소스로부터 반환할 수 있다.