디자인 패턴

자바(JAVA) - 템플릿 메서드(Template Method) 패턴

Hyeongjun_Ham 2023. 10. 13. 16:27

1. 의도

부모 클래스에서 알고리즘의 골격을 정의하지만,

해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의)할 수 있도록 한다.

 

2. 용도

전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.

동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현한다.

 

3. UML

Template Method Pattern UML

 

 

4. 구현

  • 예시) 커피 만들기
아이스 아메리카노 아이스 라떼
1. 물을 끓인다.
2. 끓는 물에 에스프레소를 넣는다.
3. 얼음을 넣는다.
4. 시럽을 넣는다.
1. 물을 끓인다.
2. 끓는 물에 에스프레소를 넣는다.
3. 얼음을 넣는다.
4. 우유를 넣는다.

1 ~ 3번의 알고리즘이 동일하다.

 

  • 패턴 적용 전
public class IceAmericano {
  public void makeIceAmericano() {
    boilWater();
    putEspresso();
    putIce();
    putSyrup();
  }
  private void boilWater() {
    System.out.println("물을 끓인다.");
  }
  private void putEspresso() {
    System.out.println("끓는 물에 에스프레소를 넣는다.");
  }
  private void putIce() {
    System.out.println("얼음을 넣는다.");
  }
  private void putSyrup() {
    System.out.println("시럽을 넣는다.");
  }
}
public class IceLatte {
  public void makeIceLatte() {
    boilWater();
    putEspresso();
    putIce();
    putMilk();
  }
  private void boilWater() {
    System.out.println("물을 끓인다.");
  }
  private void putEspresso() {
    System.out.println("끓는 물에 에스프레소를 넣는다.");
  }
  private void putIce() {
    System.out.println("얼음을 넣는다.");
  }
  private void putMilk() {
    System.out.println("우유를 넣는다.");
  }
}
public class MakeCoffeeMain {
  public static void main(String[] args) {
    IceAmericano americano = new IceAmericano();
    IceLatte latte = new IceLatte();
    
    americano.makeIceAmericano();
    latte.makeIceLatte();
  }
}

 

  • 패턴 적용 후
public abstract class Coffee {
  final void makeCoffee() {
    boilWater();
    putEspresso();
    putIce();
    putExtra();
  }
  
  // SubClass에게 확장/변화가 필요한 코드만 코딩하도록 한다.
  abstract void putExtra();
  
  // 공통된 부분은 상위 클래스에서 해결하여 코드 중복을 최소화 시킨다.
  private void boilWater() {
    System.out.println("물을 끓인다.");
  }
  private void putEspresso() {
    System.out.println("끓는 물에 에스프레소를 넣는다.");
  }
  private void putIce() {
    System.out.println("얼음을 넣는다.");
  }
}
public class IceAmericano extends Coffee{
  @Override
  void putExtra() {
    System.out.println("시럽을 넣는다.");
  }
}
public class IceLatte extends Coffee{
  @Override 
  void putExtra() {
    System.out.println("우유를 넣는다.");
  }
}
public class CoffeeMain {
  public static void main(String[] args) {
    IceAmericano americano = new IceAmericano();
    IceLatte latte = new IceLatte();
    
    americano.makeCoffee();
    latte.makeCoffee();
  }
  
}

 

5. Template Method 패턴의 장단점

  • 장점
    • 중복 코드를 줄일 수 있다.
    • 서브 클래스의 역할을 줄이고 핵심 로직을 상위 클래스에서 관리하므로 관리가 용이해진다.
    • 새로운 비즈니스 로직이 추가되어도 기존 코드에 변경이 없다.
  • 단점
    • 알고리즘의 제공된 골격에 의해 유연성이 제한될 수 있다.
    • 상위클래스에서 선언된 추상 메서드를 하위 클래스에서 구현할 때 그 메서드가 어느 타이밍에 호출되는지 로직을 이해해야 할 필요가 있다.
    • 리스코프 치환 법칙을 위배할 여지가 있다.

 

 

출처 :

https://refactoring.guru/design-patterns/template-method

 

Template Method

Problem Imagine that you’re creating a data mining application that analyzes corporate documents. Users feed the app documents in various formats (PDF, DOC, CSV), and it tries to extract meaningful data from these docs in a uniform format. The first vers

refactoring.guru