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.
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?
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:
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…
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.
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…
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.