Template Method Pattern

Fixed Steps, Custom Details

An abstract class defines the order of steps in a final method. Subclasses fill in individual steps. Frameworks like Spring use this pattern a lot (e.g. JdbcTemplate).

Example

public class Main {
    public static void main(String[] args) {
        new CsvReport().generate();
        System.out.println();
        new PdfReport().generate();
    }
}

abstract class Report {
    final void generate() {          // the template: order cannot change
        loadData();
        format();
        save();
    }

    private void loadData() {
        System.out.println("Loading sales data");
    }

    abstract void format();          // step decided by subclass

    void save() {                    // hook with a default
        System.out.println("Saved to /reports");
    }
}

class CsvReport extends Report {
    @Override void format() { System.out.println("Formatting as CSV"); }
}

class PdfReport extends Report {
    @Override void format() { System.out.println("Formatting as PDF with charts"); }
    @Override void save() { System.out.println("Uploaded PDF to cloud storage"); }
}

Output

Loading sales data
Formatting as CSV
Saved to /reports

Loading sales data
Formatting as PDF with charts
Uploaded PDF to cloud storage