O processo de fabricação de carros exige a execução de etapas como produção da carroceria, pintura e montagem dos equipamentos, que resultam em um carro pronto para ser dirigido. Para certos tipos de carro, algumas dessas etapas exigem implementações específicas: em modelos Hatch, a carroceria é dividia em dois volumes: um para o motor e um para os passageiros e porta-malas, enquanto em modelos Sedan a carroceria é dividida em três volumes: um para o motor, um para os passageiros e um para o porta-malas. Isso significa que uma mesma implementação é irreplicável para ambos os casos. Uma classe abstrata Car possui operações abstratas (buildCarBodyWork, paintCar, mountCarParts) que representam as etapas comuns para a construção de um carro, além de uma operação concreta responsável por executar essas etapas. Duas classes, SedanCar e HatchCar, herdam da classe Car e definem suas próprias implementações para as operações abstratas definidas em Car.
AbstractClass (Car) Define a operação que executa as etapas do algoritmo e as operações que representam as etapas do mesmo.
ConcreteClass (SedanCar, HatchCar) Implementa as operações definidas para o algoritmo.
package tpmethod;
public abstract class Car {
// Atributos de Car que serão modificados durante a execução do algoritmo.
protected String color;
protected int bodyWorkVolumesNumber;
protected String engineType;
protected String tireType;
protected String starterMotorType;
//Template method que executa as etapas do algoritmo. O método é final para que
//não seja modificado pelas classes que o herdam.
public final void manufacture() {
buildCarBodyWork();
paintCar();
mountCarParts();
}
//Operações abstratas que representam as etapas do algoritmo.
public abstract void buildCarBodyWork();
public abstract void paintCar();
public abstract void mountCarParts();
public String getColor() {
return color;
}
public int getBodyWorkVolumesNumber() {
return bodyWorkVolumesNumber;
}
public String getEngineType() {
return engineType;
}
public String getTireType() {
return tireType;
}
public String getStarterMotorType() {
return starterMotorType;
}
}
package tpmethod;
public class Client {
public static void main(String[] args) {
//Instancia uma classe que representa o algoritmo para a construção de um carro Hatch.
HatchCar hatch = new HatchCar();
hatch.manufacture();
System.out.println("Built car info:");
System.out.println("Number of bodywork volumes: " + hatch.getBodyWorkVolumesNumber());
System.out.println("Car color: " + hatch.getColor());
System.out.println("Engine type: " + hatch.getEngineType());
System.out.println("Tire type: " + hatch.getTireType());
System.out.println("Starter motor type: " + hatch.getStarterMotorType());
}
}
package tpmethod;
public class HatchCar extends Car{
// Implementação específica dos métodos para a implementação de um carro Hatch
public void buildCarBodyWork(){
this.bodyWorkVolumesNumber = 2;
}
public void paintCar() {
this.color = "blue";
}
public void mountCarParts(){
this.engineType = "V Type";
this.tireType = "All Season";
this.starterMotorType = "Direct Drive";
}
}
package tpmethod;
public class SedanCar extends Car {
// Implementação específica dos métodos para a implementação de um carro Sedan
public void buildCarBodyWork(){
this.bodyWorkVolumesNumber = 3;
}
public void paintCar() {
this.color = "black";
}
public void mountCarParts(){
this.engineType = "W type";
this.tireType = "Summer";
this.starterMotorType = "Planetary Gear";
}
}