Template Method Pattern

Pros

  • Helps eliminate code duplication by providing a skeleton of steps for an algorithm that subclasses will implement
  • The template method follows the Open/Closed principle and the Hollywood Principle

Cons

  • This pattern is not meant to change much

  • Does not follow the Composition Over Inheritance principle

Example Explanation

  • PizzaMakingTemplate - An abstract class with a makePizza method (the template method) which uses the same steps, or function calls, in a set order. The only methods that need to change are preparingIngredients and addToppings so a concrete class is forced to implement their functionality.
  • PepperoniPizza - A class that implements the two abstract methods from the abstract class PizzaMakingTemplate but is not allowed to override the final makePizza method.

class Main {
  public static void main(String[] args) {
    PizzaMakingTemplate pizza1 = new PepperoniPizza();
    pizza1.makePizza();
    //Preparing dough..
    //Prebaking crust..
    //Preparing pepperoni pizza ingredients..
    //Adding pepperoni pizza toppings..
    //Baking Pizza..
    //Packing Pizza..
    //Pizza complete.

    System.out.println("");

    PizzaMakingTemplate pizza2 = new SausagePizza();
    pizza2.makePizza();
    //Preparing dough..
    //Prebaking crust..
    //Preparing sausage pizza ingredients..
    //Adding sausage pizza toppings..
    //Baking Pizza..
    //Packing Pizza..
    //Pizza complete.

  }
}

abstract class PizzaMakingTemplate{

  public final void makePizza(){
    prepareDough();
    prebakeCrust();
    prepareIngredients();
    addToppings();
    bakePizza();
    packPizza();
    System.out.println("Pizza complete.");
  }
  private void prepareDough(){ System.out.println("Preparing dough.."); }
  private void prebakeCrust(){ System.out.println("Prebaking crust.."); }
  protected abstract void prepareIngredients();
  protected abstract void addToppings(); 
  private void bakePizza(){ System.out.println("Baking Pizza.."); }
  private void packPizza(){ System.out.println("Packing Pizza.."); }
}

class PepperoniPizza extends PizzaMakingTemplate{

  @Override
  protected void prepareIngredients(){
    System.out.println("Preparing pepperoni pizza ingredients..");
  }
  @Override
  protected void addToppings(){
    System.out.println("Adding pepperoni pizza toppings..");
  }
}

class SausagePizza extends PizzaMakingTemplate{

  @Override
  public void prepareIngredients(){
    System.out.println("Preparing sausage pizza ingredients..");
  }
  @Override
  public void addToppings(){
    System.out.println("Adding sausage pizza toppings..");
  }
}

Extra Resources

https://www.javacodegeeks.com/2015/09/template-design-pattern.html

http://www.oodesign.com/template-method-pattern.html

results matching ""

    No results matching ""