Published Apr 23, 2022
[
 
]
Suppose we are getting some house built. The steps for building might look like
The order of these steps could never be changed i.e. you can’t build the roof before building the walls etc but each of the steps could be modified for example walls can be made of wood or polyester or stone.
Template method defines the skeleton of how a certain algorithm could be performed, but defers the implementation of those steps to the children classes.
In software engineering, the template method pattern is a behavioral design pattern that defines the program skeleton of an algorithm in an operation, deferring some steps to subclasses. It lets one redefine certain steps of an algorithm without changing the algorithm’s structure.
Imagine we have a build tool that helps us test, lint, build, generate build reports (i.e. code coverage reports, linting report etc) and deploy our app on the test server.
First of all we have our base class that specifies the skeleton for the build algorithm
abstract class Builder {
// template method
build() {
this.test()
this.lint()
this.assemble()
this.deploy()
}
abstract test();
abstract lint();
abstract assemble();
abstract deploy();
}
Then we can have our implementations
class AndroidBuilder extends Builder {
test() {
console.log('android test')
}
lint() {
console.log('android lint')
}
assemble() {
console.log('android assemble')
}
deploy() {
console.log('android deploy')
}
}
class IosBuilder extends Builder {
test() {
console.log('ios test')
}
lint() {
console.log('ios lint')
}
assemble() {
console.log('ios assemble')
}
deploy() {
console.log('ios deploy')
}
}
And then it can be used as
test('test template pattern', () => {
const androidBuilder = new AndroidBuilder()
androidBuilder.build()
const iosBuilder = new IosBuilder()
iosBuilder.build()
})