79
O Padrão Factory
4. O Pado Factory
Cozinhando com a
qualidade OO
Prepare-se para cozinhar alguns projetos OO
levemente ligados. Criar objetos é mais do que
simplesmente usar o operador new. Você irá aprender que
a criação de instâncias é uma atividade que não deve ser
sempre feita em público e que pode gerar problemas de
ligação. E não é isso o que você quer, não é? Veja como
os Padrões Factory podem salvá-lo de dependências
constrangedoras.
CG_ucpadroes_RI2016.indb 79 22/11/2016 09:36:16
80
Use a Cabeça Padrões de Projetos
Quando você vir “new”, pense em “concret”.
Sim, quando você usa new, certamente está criando a instância de uma classe concreta,
então isso é definitivamente uma implementação, e não uma interface. E esta é uma
boa pergunta; você aprendeu que ligar seu código a uma classe concreta pode torná-lo
mais frágil e menos flexível.
Quando você tem um conjunto inteiro de classes concretas relacionadas, geralmente
é forçado a escrever o código assim:
Aqui, temos várias classes sendo instanciadas, e a decisão de qual instanciar é tomada
no tempo de execução dependendo de algumas condições.
Quando você vê um código assim, sabe que, quando chegar a hora de alterações ou
extensões, terá que reabrir esse código e examinar o que precisa ser adicionado (ou
excluído). Geralmente, esse tipo de código termina em várias partes do aplicativo,
tornando a manutenção e a atualização mais difíceis e com maior chance de ter erros.
OK, já se passaram três capítulos
e você ainda não respondeu à minha
pergunta sobre new. Não devemos
programar para uma implementação,
mas isso é exatamente o que eu faço
toda vez que uso new, certo?
Duck duck = new MallardDuck();
Queremos usar interfaces
para manter o código flexível.
Mas temos que criar uma
instância de uma classe concreta!
Duck duck;
if (picnic) {
duck = new
MallardDuck();
} else if (hunting) {
duck = new
DecoyDuck();
} else if (inBathTub) {
duck = new
RubberDuck();
}
Temos várias classes
diferentes de patos e não
sabemos até o tempo de
execução qual precisa ser
instanciada.
CG_ucpadroes_RI2016.indb 80 22/11/2016 09:36:17
81
O Padrão Factory
O que há de errado com “new”?
Tecnicamente, não há nada errado com new; afinal, é uma parte fundamental de Java. O verdadeiro
culpado é nosso velho amigo CHANGE e como ele afeta o uso de new.
Ao codificar para uma interface, você sabe que pode se isolar de várias alterações que podem acontecer
em um sistema. Por quê? Se seu código é escrito para uma interface, ele irá funcionar com qualquer classe
nova que implementa essa interface por meio do polimorfismo. No entanto, quando você tem um código
que utiliza muitas classes concretas, está procurando problemas porque o código pode ter que ser alterado à
medida que novas classes concretas são adicionadas. Assim, em outras palavras, seu código não será “fechado
para modificação”. Para estendê-lo com novos tipos concretos, ele terá que ser reaberto.
Então, o que fazer? É em momentos assim que você pode voltar aos Princípios de Pojeto OO para procurar
dicas. Lembre-se, nosso primeiro princípio lida com a mudança e nos guia para identificar os aspectos que variam
e os separam do que continua igual.
Identicando os aspectos que variam
Imagine que você tem uma pizzaria e, como dono de uma pizzaria moderna em Objectville, pode escrever um código assim:
Pizza orderPizza() {
Pizza pizza = new Pizza();
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
Mas você precisa de mais do que um tipo de pizza...
Depois, você adiciona um código que determina o tipo apropriado de pizza e depois cria a pizza:
Pizza orderPizza(String type) {
Pizza pizza;
if (type.equals(“cheese”)) {
pizza = new CheesePizza();
Lembre-se de que os designs devem ser
abertos para extensão, mas fechados para
modificação” – consulte o Capítulo 3 para
fazer uma revisão.
Poder
da Mente
Como você pode pegar todas as partes de seu aplicativo que instanciam as
classes concretas e separá-las ou encapsulá-las do resto do aplicativo?
Por motivos de flexibilidade,
realmente queremos que seja uma
classe ou uma interface abstrata,
mas não podemos instanciar
diretamente nenhuma delas.
Agora, estamos passando o tipo
de pizza para orderPizza.
Mas você tem que criar um
objeto em algum momento e
Java só nos dá uma maneira de
criar um objeto, certo? Então,
no que isso dá?
CG_ucpadroes_RI2016.indb 81 22/11/2016 09:36:17

Get Use A Cabeça Padrões E Projetos now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.