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