Só uma observação:
na regra negocial do teu exemplo, podem existir vários tipos de Alertas, certo?
E o código responsável por criar os objetos Alerta está baseado numa estrutura de decisão do tipo switch-case.
Geralmente, esta não é uma boa decisão em projetos OO. Pode não ser o caso do teu exemplo, mas ao se adicionar um novo tipo de Alerta, precisaríamos alterar o switch-case para criar o novo tipo.
Daí, se em outro ponto do projeto você precisa emitir um relatório, também teríamos que alterar o switch-case.
Em outro ponto, o código envia um e-mail baseado no tipo do alerta >> mais manutenção…
Uma boa opção é deixar a fábrica construir os alertas da seguinte maneira:
Map mapaDeAlertas = new HashMap();
mapa.put(“indevido”, new AlertaParadaIndevida());
mapa.put(“foraDeRota”, new AlertaForaDeRota());
Essas atribuições no mapa poderiam estar definidas num arquivo XML, por exemplo.
Daí a Fábrica faria apenas:
public static Alerta getAlerta(String tipo){
return (Alerta) mapa.get(tipo);
}
Neste caso, se você precisar de um novo tipo de Alerta, precisaria apenas criar a classe AlertaTal implementando a interface Alerta, e incluir o mapeamento:
“alertaTal”, new AlertaTal()
O resto inteiro da aplicação não sofreria absolutamente nenhuma manutenção.
Enfim, espero ter ajudado. Qualquer coisa é só enviar uma mensagem. Em breve vou colocar no meu blog um exemplo detalhado sobre isso, que tem a ver com vários padrões, como Flyweight, Strategy, State, AbstractFactory, etc.
[]'s,
Marcone - http://marconems.blogspot.com