JAVA

[JAVA] 템플릿 메소드 패턴

집한구석 2021. 11. 29. 22:17
728x90

정의

  • 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체 일을 수행하는 구조를 바꾸지 않으면서 특정 단계를 수행하는 내역을 바꾸는 패턴
  • GoF 디자인 패턴의 분류에 행위 패턴에 포함
  • abstract, final 키워드를 사용해서 구현하며, final 메소드와 abstract 메소드로 로직의 흐름만을 정의하고 구체적인 구현은 하위클래스에 위임함
  • 구현별로 달라질수 있는 메소드들은 구현 클래스에서 선언 후 호출하는 방식으로 함
  • 변하는 것과 변하지 않는 부분을 분리해주는 것을 해결하는 디자인패턴 (EX. 비즈니스 로직 기능은 변함, 로깅 기능은 변하지 않는 부분이며 둘을 모듈화가 가능하게 해줌)

템플릿 메서드 패턴은 템플릿이라는 기준이 되는 틀에서 변하지 않는부분을 몰아두고, 일부 변하는 부분을 별도로 호출해서 해결하는 패턴임


사용하는 용도

  • 전체적으로 동일하면서 부분적으로 다른 구문으로 구성된 메서드의 코드 중복을 최소화할 때 유용함
  • 소스코드상의 알고리즘에서 특정 환경 또는 상황에 맞게 확장 또는 변경해야할 경우 사용

예시

public abstract class CarTemplate {
  //템플릿 메소드
  public final void buildCar() {
    buildHandle();
    buildDoor();
    buildOs();
    buildTire();
  }

  private void buildHandle() {
    System.out.println("핸들 구성 완료 !");
  }

  private void buildDoor() {
    System.out.println("문 구성 완료 !");
  }

  public abstract void buildOs();
  public abstract void buildTire();

}

public class Sonata extends CarTemplate{

  @Override
  public void buildOs() {
    System.out.println("소나타 OS 구성 완료 !");
  }

  @Override
  public void buildTire() {
    System.out.println("현대타이어 구성 완료 !");
  }
}

public class Model3 extends CarTemplate {

  @Override
  public void buildOs() {
    System.out.println("테슬라 OS 구성 완료 !");
  }

  @Override
  public void buildTire() {
    System.out.println("투어링 타이어 구성 완료 !");
  }
}

public class TemplateSample {

  public static void main(String[] args) {
    Model3 model3 = new Model3();
    model3.buildCar();

    Sonata sonata = new Sonata();
    sonata.buildCar();
  }
}

특징

  • 상속과 오버라이딩을을 통한 다형성으로 문제를 해결함
  • 코드중복 감소 및 객체 추가 및 확장을 쉽게 가능하도록 함
  • 자식 클래스의 역할을 감소시키면서 핵심로직 관리가 용이함
  • 추상클래스와 구현클래스간 복잡성이 증대되며, 추상메소드가 많아지면 관리가 복잡해짐
  • 상속으로 인하여 부모클래스 즉 추상클래스의 의존성이 증대됨 

'JAVA' 카테고리의 다른 글

[JAVA] 프록시패턴  (0) 2021.12.09
[JAVA] ThreadLocal  (0) 2021.12.03
[JAVA] 전략패턴  (0) 2021.11.29
[JAVA] TreeMap  (0) 2021.11.08
[JAVA] Junit5  (0) 2021.10.13