Templated Method

Vantagens

Desvantagens

Exemplos

Exemplo #1

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.

Diagrama de Classe

Exemplo #1 - Diagrama

Participantes

  • 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.

Código

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";
    }
}
Clique aqui para fazer o download do código completo de implementação deste Design Pattern.

Padrões Relacionados

Este Padrão pode ser usado para resolver os seguintes problemas: