JAVA/DesignPattern

Design Pattern 디자인 패턴 Template Pattern 템플릿 패턴

호두밥 2021. 12. 31. 20:48

Template Pattern 템플릿 패턴

행동 패턴으로, 상위 클래스(인터페이스, 추상클래스)에서 알고리즘의 골격만 정의하고, 하위 클래스에서 재정의(Override)할 수 있도록 하는 패턴입니다. 

Template Pattern 템플릿 패턴이 적합한 경우

  • 기존 알고리즘에서 몇가지 기능만 추가한 객체를 만들고 싶은 경우 (몇가지 기능이 추가된 하위 클래스를 생성)
  • 서로 조금씩만 다른 클래스가 여러개 있는 경우 (공통의 기능을 템플릿으로 묶어내어 코드의 중복을 줄일 수 있음)   

장단점

장점

  • 많은 기능 중에서 몇가지만 재정의하여 객체를 생성할 수 있습니다. 다른 객체가 받는 영향을 줄일 수 있습니다.
  • 중복되는 코드를 상위 클래스로 옮길 수 있습니다. 

단점

  • 몇몇 객체들은 알고리즘 구조를 생성하기 어려울 수 있습니다. 
  • default 기능은 하위클래스에서 구현하지 못하도록 제한해 리스코프 치환 원칙을 위반할 수 있습니다.

* 리스코프 치환 원칙 : 객체 지향 프로그래밍의 원칙 중 하나. 프로그램의 변동 없이 상위 클래스의 기능이 하위 클래스의 기능으로 치환되어야 한다는 원칙

 

Template Pattern 템플릿 패턴 구현

템플릿인 Beverage Recipe를 생성하고 메소드 틀(정의)를 작성합니다. 그리고 templete를 상속받은 CoffeeRecipe와 TeaRecipe를 생성하고 기능을 구현합니다.

Beverage Recipe에 정의된 메소드를 순차적으로 실행하는 클래스인 Print Recipe를 생성합니다.  

BeverageRecipe

public abstract class BeverageRecipe {

    public abstract void getIngredient();
    public void boilingWater(){
        System.out.println("물을 끓인다.");
    };
    public abstract void brew();
    public void pourIntoACup(){
        System.out.println("컵에 따른다.");
    }
}

CoffeeRecipe

public class CoffeeRecipe extends BeverageRecipe{
    @Override
    public void getIngredient() {
        System.out.println("커피가루를 준비한다.");
    }

    @Override
    public void brew() {
        System.out.println("커피를 내린다.");
    }
}

TeaRecipe

public class TeaRecipe extends BeverageRecipe{
    @Override
    public void getIngredient() {
        System.out.println("차(티백)을 준비한다.");
    }

    @Override
    public void brew() {
        System.out.println("차(티백)을 우린다.");
    }
}

PrintRecipe

public class PrintRecipe {
    BeverageRecipe recipe;

    public PrintRecipe(BeverageRecipe recipe) {
        this.recipe = recipe;
    }

    public void print(){
        recipe.getIngredient();
        recipe.boilingWater();
        recipe.brew();
        recipe.pourIntoACup();
    }
}

Main

public class Main {
    public static void main(String[] args) {

        PrintRecipe coffeeRecipe = new PrintRecipe(new CoffeeRecipe());
        coffeeRecipe.print();

        System.out.println();

        PrintRecipe teaRecipe = new PrintRecipe(new TeaRecipe());
        teaRecipe.print();
    }
}
커피가루를 준비한다.
물을 끓인다.
커피를 내린다.
컵에 따른다.

차(티백)을 준비한다.
물을 끓인다.
차(티백)을 우린다.
컵에 따른다.

참조