Blz galera?
Aqui tô com o seguinte problema:
Tenho uma classe Forma e algumas filhas: Quadrado, Circulo, Triangulo.
Tenho também um Jframe onde há uma toolbox onde você pode selecionar a forma que quer desenhar, e um PanelDesenho que é uma classe capaz de desenhar essas formas, (O método de desenho está na classe Forma(abstrato), e as outras classe o implementam…).
Vou ter que criar um se pra cada Forma? Queria uma jeito que, quando o usuário fosse desenhar no PanelDesenho eu instanciasse a forma correta, e, quando criar novas formas (Estrela por exemplo), não precise alterar a classe PanelDesenho adicionando mais if’s pra ela saber qual forma desenhar…
Alguma sugestão? Padrão de Projeto? Gambiarra?
Valeu,
posta a imagem desse projeto aqui… fiquei curioso…
O ideal é criar uma classe para cada sim. O padrão de projeto para evitar os ifs é o strategy.
Você pode ver mais detalhes de Java 2D no meu site (link na minha assinatura).
Junior, aqui, não sei se é bem isso que vc quer…
heheeh
TEm um esboço idiota do sistema… É basicamente isso…
Preciso de saber como vou fazer, se, cada Forma sabe desenhar a se mesma e eu não ter que ficar panelDesenho.setForma(“Quadrado”), e na classe PanelDesennho não ter que fazer um monte de if, quando o usuário estiver desenhando a imagem…

Se quiser ver o diagrama de classes eu envio, e, basicamente é o que desecrevi no post… Cada classe que herda forma tem que implementar o método drawYourselg(Graphics g), onde elas se desenham no Graphics que eu passar…
ViniGodoy, vou dar uma olhada no Strategy e no seu site, eu já estava ciente que é inviável não fazer uma classe para cada forma, mas quero deixar o sistema o mais extensível possível, e permitir que a adição de uma forma posteriormente altere o menor numero possível de classes…
valeu pessoal…
Justamente fazer uma classe para cada forma é o que vai tornar seu sistema extensível.
Isso através do polimorfismo.
Tudo bem ViniGodoy, mas quando o usuário arrastar o mouse eu terei de desenhar a forma que ele selecionou, aí vou fazer um if?
Tipo vou ter um
//Quando o usuário selecionar o quadrado na barra de ferramentas
setFormaPraDesenhar.(PanelDesenho.QUADRADO);
//e no código do panel, quando o usuário soltar o mouse, chamar o paint componente
public class PanelDesenho{
String forma;
List<Forma> lista;
...
public static final QUADRADO = "q";
public static final CIRCULO = "c";
public static final... :oops:
....
Forma shape;
if (forma.equals(QUADRADO)){
shape= new Quadrado(x,t,largura, altura);
}
else if (forma.equals(CIRCULO)){
shape= new Circulo(x,t,largura, altura);
}
else if (forma.equals(TRIANGULO)){
shape= new Triangulo(x,t,largura, altura);
}
else if (forma.equals(QUADRADOARREDONDADO)){
shape= new QuadradoArredondado(x,t,largura, altura);
} :oops:
lista.add(shape);
for (Forma f :lista) f.drawYourselg(g);
...
}
Eram esses if’s e a adição de outros que desejo evitar… entenderam?
Realmente, vc não precisa desses ifs.
Essa variável forma não deveria ser uma String, e sim uma classe, que permita que vc crie as formas por polimorfismo.
Mas eu teria que fazer isso com reflection certo? :roll:
ou estou sendo ignorante? 
Não, o código do seu botão ficaria:
public void botaoTrianguloClick(ActionEvent evt) {
this.fabricaDeForma = new FabricaTriangulo();
}[/code]
E, na hora que o usuário soltar o mouse:[code]
Forma shape = fabrica.criarForma(x, y, w, h);
lista.add(shape);
for (Forma f : lista) f.drawYourself(g);

ViniGodoy,
Isso é Abstract Factory?
Dei uma olhada lá no seu site, muito bom o material. Você tem algum tutorial, ou links que me ajudem a desenhar as formas na tela? está funcionando perfeitamente com imagens menores, mas com imagens muito grande, (imagem de fundo), fica bem lento, já que tenho que desenhar a imagem nop drag do componente…
Isso é o factory method. E, por incrível que pareça, fábricas assim também são parte do padrão Strategy.
O abstract factory é quando vc tem diversas fábricas para componentes relacionados, numa mesma classe.