Uma equipe de uma agência reguladora de transporte precisa desenvolver um módulo para a criação dinâmica de protocolos de segurança de trens. Existem diversos tipos de trens e sistemas de sinalização (Convencional, CPTM etc.) e o protocolo de segurança a ser gerado depende de qual configuração de trem está ativa naquele momento. No entanto, o código que usa esse protocolo precisa ser desacoplado do tipo específico de trem. Inicialmente foi criado o trecho de código Java abaixo, que define um trem e um método de validação de protocolo.
interface Trem {
String getIdentificador();
String validarProtocolo();
}
class TremConvencional implements Trem {
public String getIdentificador() { return "Convencional-A"; }
public String validarProtocolo() { return "Protocolo Convencional OK."; }
}
class TremCPTM implements Trem {
public String getIdentificador() { return "CPTM-Z"; }
public String validarProtocolo() { return "Protocolo CPTM OK."; }
}
public class GerenciadorDeCriacao {
public Trem criarTrem(String tipo) {
if (tipo.equals("CPTM")) {
return new TremCPTM();
} else if (tipo.equals("CONV")) {
return new TremConvencional();
}
return null;
}
}
Para atender ao requisito de criação dinâmica e independente dos objetos de trem, permitindo que a aplicação cliente use a interface Trem sem conhecer as classes concretas (TremConvencional, TremCPTM etc), o Design Pattern GoF que deve ser implementado no lugar da classe GerenciadorDeCriacao é o