Duvida sobre factory mathod

Minha duvida pode até ser um tanto quanto ignorante, mais comeceii a ler sobre patterns agora…e estava lendo sobre factory mathod…e o pessoal(até aki no guj) diz q uma das vantagens é q nao precisa asber qual objeto criar, a factory faiz isso…,mais c for v, vc vai solicitar um objeto especifico pra factory, o q diz q vc tem q saber qual objeto instanciar, intaum…c eu sei qual objeto, qual a vantagm de ter um metodo só pra instanciar o objeto, pode ser q estou falando besteira, mais parece meio inutil…se alguem puder me esplicar melhor…agradeceria muito,

e me desculpem se eu disse alguma coisa absurda(o que eu nao duvido), mais é q eu realmente nao intendi direito a finalidade, e pelo q eu vi…varias pessoas usam, e gostaria de saber pq q é tão bom.

Agradeco desde ja.

Na verdade vc não sabe qual objeto vai instanciar… vc sabe a interface dele, o objeto irá variar de acordo com a implementação do Factory usada…

Sim, que a factory vai instaciar eu concordo, mais para isso, pode ser por exemplo atravez de um parametro, dependendo do parametro ele instaca um objeto certo?..intaum…mais para mandar o parametro, eu tenho q saber o que eu quero…qual o bjeto…certo?

Não acho interessante usar parametros, da uma olhada nesta figura…

http://java.sun.com/blueprints/corej2eepatterns/Patterns/images09/figure09_07.gif

vc usaria uma DaoFactory (interface) e a implementação CloudScapeDaoFactory para criar Daos do tipo Cloudscape<alguma coisa> DAO

agora suponha q vc tenha uma outra arvore nesta figura, outra implementação de DaoFactory, que crie DAO de outros tipos… vc continuaria com sua
DaoFactory (interface) no cliente, mas ao mudar a implementação para o OutraCoisaDaoFactory e não CloudScapeDaoFactory, vc obteria outros objetos, que também implementariam as interfaces CustomerDAo,etc…

Bom, o que vc me disse agora é o conseito de usar uma interface, isso eu intendo, sei pq usar e tudo a minha grande duvida é o seguinte, vou usar um exemplo(pode estar errado, devido ao fato de eu nao intender muito bem sobre isso):

Digamos q eu tenho uma class

responsavel pela crição de objetos, dentro dela eu tenho por exemplo:

public class Factory(){

  public Cliente clienteFactory(){
     return new Cliente();
  }

  public Funcionario funcionarioFactory(){
     return new Funcionario();
  }
}

e assim por diante.

para eu instanciar um cliente eu nao teria q fazer isso:

Factory cliente = cliente.clenteFactory();

alguma coisa assim??

e para o funcionario:

Factory funcionario = funcionario.funcionarioFactory();

Não seria isso, se for assim, eu tenho q saber q eu quero um cliente ou um funcionario pra poder chamar os metodos e a factory instanciar o objeto.

Estou certo ou errado?

No seu exemplo vc não está usando nenhuma interface…??? ai realmente não tem muita vantagem, se Funcionario fosse uma interface e Factory também, vc poderia ter uma implementação de Factory que retornasse Funcionarios Terceirizados e outra que retorne os da empresa (sendo cada um uma implementação de Funcionario), seu cliente conheceria as interfaces Factory e Funcionario e em runtime poderia estar trabalhando com terceirizados ou não, de acordo com a implementação de Factory q vc usar… :wink:

Vejamos.

Suponha que você tem a seguinte interface:

public interface ArmaDeFogo { void atirar(); }
Suponha também que você tem as seguintes armas:

[code]class Revolver implements ArmaDeFogo {
public void atirar() {
System.out.println(“Balas de revólver.”);
}
}

class Espingarda implements ArmaDeFogo {
public void atirar() {
System.out.println(“Cartuchos de 12.”);
}
}[/code]
Agora você quer instanciar objetos das classes que você escreveu. Você pode fazer isso de duas formas:

:arrow: Usar new diretamente. O problema dessa abordagem é que seu código precisa referenciar diretamente as implementações de armas de fogo ( e conhecer todos os detalhes de sua criação, como por exemplo os parâmetros passados para o construtor ). Veja a seguir:

ArmaDeFogo revolver = new Revolver(); ArmaDeFogo espingarda = new Espingarda();Se um dia a forma de instanciação de armas de fogo mudar, você terá que propagar a manutenção por todo o seu código.

:arrow: Ou você pode construir uma fábrica de armas de fogo:

[code]public class Factory {
public static ArmaDeFogo getRevolver() {
return new Revolver();
}

public static ArmaDeFogo getEspingarda() {
    return new Espingarda();
}

}[/code]E quando você for instanciar uma arma de fogo, pode fazer simplesmente:

Arma revolver = Factory.getRevolver(); Arma espingarda = Factory.getEspingarda();Dessa forma, você tem um local centralizado para instanciar seus objetos, além de abstrair do código cliente todos os detalhes do processo de instanciação - afinal, tudo o que você precisa nesse caso é atirar, não importa com qual arma.

è realmente nao usei interface…

mais é o seguinte…o meu ponto é q mesmo q eu tenho uma classe interface para funcionario e para factory, para eu instanciar um funcionaario tercearizado por exemplo, eu teria q chamar um metodo da classe factory que implementa a interface factory, até ai tudo certo…eu intendi até como funciona a facotry, mais para eu chamar um metodo pra criar um objeto funcionario tercearizado, eu preciso saber que eu quero um funcionario tercearizado, conclusao(na minha opniao), de qqer jeito eu vou saber o que criar, a factory nada mais é do que uma classe para centralizar a criação de objetos…é isso??

Bom nao tinha lido sua resposta tnaires, agora sim ficou claro pra mim…estou certo intaum…a factory é um modo de centralizar a criacao de objetos…vlw pelo esclarecimento…e vlw tbm fpavao, suas explicaçõe sforam de grande ajuda tbm…

Brigadao msm pessoal… :slight_smile:

Oi caloro,

Bacana sua preocupação em entender os padrões, também estou nessa rsrsrs.

Acho que o problema é que vc leu ou ouviu dizer que ao utilizar esse padrão não precisaria “saber qual objeto instanciar” e vc levou ao pé da letra isso e de forma, vamos dizer dizer assim, superficial ( o que é natural ).

Achei o exemplo do tnaires bacana:

[quote=tnaires] Arma revolver = Factory.getRevolver();
Arma espingarda = Factory.getEspingarda(); [/quote]

Imagine (acho que ele até disse isso) que na implementação do objeto revolver haja alguma alteração, vc não teria que ajustar estas duas linha apresentada acima e obviamente os objetos não seriam mais os mesmos, se fosse passado algum parametro para getRevolver() ex: getRevolver(Revolver.TAUROS), o usuário deste método não tem condições de dizer qual classe foi instanciada pra gerar o revolver, provavelmente irá dizer que a classe implementou a interface Arma.

Nas explicações sobre os padrões sempre vem os pontos positivos, negativos e o objetivo do padrão faça uma revisão, certamente vc verá que tem mais coisa do isso (saber qual objeto será instanciado) envolvido neste padrão.

Espero ter ajudado e não ter falado muita m#$!@.

P.S. Padrões e Cachaça, use com moderação.

[]'s

Discordo… cachaça, faz muito bem para saúde! :lol: