Chegamos ao quarto artigo da série de Design Pattern já tendo visto os padrões Strategy, Decorator, Template Method e Factory Method. A essa altura você já confirmou o que afirmei no primeiro artigo: design patterns podem mudar radicalmente a sua forma de codificar. Você já está pensando duas vezes antes de criar um desenho baseado em herança, e considera antes se a composição não seria uma melhor opção, utilizando o padrão Strategy ou Decorator. E quando utiliza herança, tem a sua disposição ferramentas poderosas como o padrão Template Method e o Factory Method, vistos no último artigo.

Seguiremos neste artigo explorando os problemas do “new”. Busque a edição anterior da revista e tente lembrar porque o “new” pode nos trazer problemas. Lembre-se dos problemas que resolvemos com o padrão Factory Method. Veremos agora os problemas que o Factory Method não resolveu, mas que seu “primo irmão” Abstract Factory resolverá. Os dois padrões são muito parecidos, abordam necessidades parecidas, mas atendem estas necessidades de forma diferente, porque afinal, parecido não é igual. De tão parecidos, muitos os tomam por um só padrão, como se houvesse somente um único padrão “Factory”.

Onde paramos

É uma boa idéia revisar o que foi feito no artigo anterior. Iniciamos o artigo com um aplicativo de jogo, com classes de contexto de jogo e de lutadores. O aplicativo era plenamente funcional, mas tinha sérios problemas de dependência, alto acoplamento, e muita dificuldade para realizar qualquer tipo de mudança. Ao longo do artigo refatoramos muitos de seus métodos e revimos suas camadas. O diagrama de classes do artigo ficou, ao final, como o da Figura 1. A Tabela 1 mostra o que cada classe faz e suas responsabilidades. A Listagem 1 mostra o código de teste, e nos permite lembrar mais claramente as interfaces do objeto de contexto de jogo e lutador.

Diagrama de classes com implementação do Factory Method
Figura 1. Diagrama de classes com implementação do Factory Method
...
Classe Responsabilidade
ContextoDeJogo Prepara e encerra o jogo, solicita a criação dos objetos do tipo Lutador com base em parâmetros recebidos, configura a cor da janela de console, informa sobre o Local, agita as Pessoas presentes à luta, realiza Sons, Prepara os lutadores e configura seus oponentes.
Lutador Se prepara, pula, realiza 2 tipos diferentes de golpes. Possui um nome e um oponente configurado. Tudo potencialmente, na prática não programa nenhuma dessas ações, deixando para as classes herdeiras esse trabalho.
ContextoDeJogoFase1 e ContextoDeJogoFase2 Criam os lutadores de acordo com o parâmetro recebido e criam a arena de jogo, configurando o Local, as Pessoas e os Sons.
Agil, Forte, Ninja e Espadachim
Quer ler esse conteúdo completo? Tenha acesso completo