Oi pessoal.
Antes de mais nada, quero chegar pedindo desculpas pela ignorância no assunto. Estou estudando padrões de projeto e não estou achando muito fácil.
Já estudei alguns e agora estou estudando o Prototype, usando o livro do GoF e o Head First (o do GoF eu acho meio complicado de entender).
Peguei o exemplo da Wikipedia (do bolo).
Eu tenho uma classe Bolo, que contém o método clone. Como subclasse, tenho uma class BoloDeCenoura e BoloDeChocolate. Tenho também no projeto a classe MaquinaDeBolos, que, basicamente, chama o bolo usando clone.
Até aí tudo bem. A classe Bolo está assim:
public class Bolo implements Cloneable {
/**
* Metodo de clonar um objeto
* @return objeto clonado
*/
public Object clone() {
try {
Bolo copia = (Bolo)super.clone();
return copia;
} catch (Exception e) {
System.out.println("Opz!");
e.printStackTrace();
return null;
}
}
/**
* Metodo que retorna a descricao de um bolo
* @retrun descricao
*/
public String getDescricao() {
return "";
}
}
O método getDescricao() retorna o nome do bolo e é sobrescrito pelas duas subclasses. É aqui que tenho uma dúvida (muito boba, por sinal): muitas pessoas (inclusive aqui do guj) são a favor de usar composição ao invés de herança. Eu até li que um dos usuários (Paulo Silveira) falou que prefere usar interfaces ao invés de classes abstratas.
Eu pensei em colocar a classe Bolo como abstrata e deixar o método getDescricao() abstrato (do jeito que está é muito ruim). Porém, quero evitar classes abstratas (dicas do GUJ). Então, se eu fosse ter que tirar a implementação do getDescricao(), eu teria que transformar bolo em interface e escrever o método clone em cada uma das subclasses. Porém isso traz uma desvantagem que é a não-reutilização de código (não digo desvantagem, mas é uma coisa estranha para mim), ou seja, a cada novo bolo, eu teria que praticamente reescrever uma classe inteira (nesse caso são dois métodos, mas se fossem tipo uns 10 ficaria complicado, não?).
Existe um jeito mais fácil de fazer isso? Eu não concordo muito com essa idéa de não usar classes abstratas porque nesse caso, eu acredito que ajuda. Eu não poderia tirar a herança desse caso porque na classe MaquinaDeBolos está usando polimorfismo. A composição, se eu fosse utilizar, quebraria o polimorfismo?
Desculpem, minha dúvida é realmente muito besta, mas isso está me incomodando a alguns dias.