Dúvida em padrão Factory

9 respostas
J

Pessoal

Estou com uma dúvida em quando aplicar o padrão Factory.

Já li diversos tutoriais por aí, mas continuo com dúvidas.

Dentre as diversas explicações que achei, as mais frequentes, foram:

  • Evitar usar o new, com uma classe concreta e assim, dar ênfase ao poliformismo.
    Minha dúvida: se for assim, por que não utilizar SEMPRE o factory?

  • Para realmente criar objetos polimórficos, como ArrayList ou LinkedList.
    Minha dúvida: se for assim, por que o próprio Java não é assim, com as classes que extendem List?

  • Para simplificar a instanciação de objetos.
    Minha dúvida: então, quando NÃO usar este padrão?

Alguém pode me ajudar?

Grato

Julio Romano

9 Respostas

Omeganosferatu

Cara geralmente usamos factorys quando queremos trabalhar com a mesma instancias em varios lugares do projeto… por exemplo um objeto conexão… Se toda vez que você for utilizar uma conexao, voce instanciar uma… seu programa vai ter serios problemas, pois vai abrir inumeras conexoes… Porem com o Factory voce vai verificar… se nao existe nenhuma conexao, voce instancia… e se alguem ja tiver feito isso, voce simplesmente retorna o objeto que ja foi criado em algum ponto no seu sistema.

Pelo menos é o que eu entendo sobre a funcionalidade desse padrão…

Abs.

PS. Da uma procurada no scribd que tem alguns pdfs bons sobre patterns, com casos de uso e etc

wesley.comput

Boa tarde julio.

Na minha visão uma das principais vantagens do padrão Factory é a economia de objetos que você têm criando famílias de objetos. Segue um exemplo simples, espero que ajude.

public abstract class Funcionario {
    protected String strCargo;
    
    public String getCargo() {
        return this.strCargo;
    }
}
/**
 * Fabrica de carros "objetos"
 * @author Wesley
 */
public class FuncionarioFactory {
    
    public static Carro geFuncionario(String strCargo) {
        if(strCargo == null) return null;
        if(strCargo.equals("Secretaria")) return new Vectra();
        if(strCargo.equals("Gerente")) return new Omega();
        else return null;
    }
}
public class Gerente extends Funcionario {
     
    public Gerente() {
        strCargo = "Gerente";
    }
}
public class Secretaria extends Funcionario {
    
    public Secretaria() {
        strCargo = "Secretaria";
    }
}
public class Teste {
    public static void main(String args[]) {
       Funcionario funcionario = null; 
       funcionario = new Secretaria();
       System.out.println(funcionario.strCargo);
       funcionario = new Gerente();
       System.out.println(funcionario.strCargo);
    }
}
sergiotaborda

Quem disse que não é para utilizar sempre ? É para utilizar sempre sim.
Só que, se for utilizar sempre vc não vai querer usar Factory directamente, vc vai querer usar um injection container
que básicamente é uma forma de usar Factory sempre.

Objectos não são polimorficos, as variáveis é que são. Esta pergunta eu não entendi.

Quando o seu sistema é muito simples. Quando não está sendo usado polimorfismo.
Quando, mesmo não utilizando polimorfismo não ha necessidade de inicialização especial.

Por exemplo factory não seri usada nos seguintes casos

String hello = "Hello"

int numero = 3434;

BigDecimal dec = new BigDecimal("2347234.90123");
wesley.comput

Desculpem o erro na segunda seção de código. Segue corrigida…

/**  
* Fabrica de funcionarios "objetos"  
* @author Wesley  
*/   
public class FuncionarioFactory {   
       
    public static Funcionario geFuncionario(String strCargo) {   
        if(strCargo == null) return null;   
        if(strCargo.equals("Secretaria")) return new Secretaria();   
        if(strCargo.equals("Gerente")) return new Gerente();   
        else return null;   
    }   
}
sergiotaborda
wesley.comput:
Desculpem o erro na segunda seção de código. Segue corrigida...
/**  
* Fabrica de funcionarios "objetos"  
* @author Wesley  
*/   
public class FuncionarioFactory {   
       
    public static Funcionario geFuncionario(String strCargo) {   
        if(strCargo == null) return null;   
        if(strCargo.equals("Secretaria")) return new Secretaria();   
        if(strCargo.equals("Gerente")) return new Gerente();   
        else return null;   
    }   
}

1) Factory é uma classe, não pode ser implementado com static. O seu codigo cria uma classe com um Factroy Method, mas não cria um factory (o método não é polimorfico)
2)Um factory não tem parametros para a criação. todas as decisões são feitas pelo proprio factory.

Isso não é um Factory, é um Locator.
Locator ( conhecido pelo seu irmão Service Locator) recebe parametros para saber que objeto retornar.

Omeganosferatu

Eu nao posso ter um factory static ?

public class ConnectionFactory {

   public static Connection getConnection( ) {
      try {
         Class.forName("com.mysql.jdbc.Driver");
         Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/teste", "root", "856423" );
         System.out.println( "Conectado" );
         return con;
         
      } catch( SQLException e ) {
         e.printStackTrace();
         
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      }
      System.out.println( "Falhou conexão!" );
      return null;
   }


}

por exemplo ??
vlw

sergiotaborda
Omeganosferatu:
Eu nao posso ter um factory static ?
public class ConnectionFactory {

   public static Connection getConnection( ) {
      try {
         Class.forName("com.mysql.jdbc.Driver");
         Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/teste", "root", "856423" );
         System.out.println( "Conectado" );
         return con;
         
      } catch( SQLException e ) {
         e.printStackTrace();
         
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      }
      System.out.println( "Falhou conexão!" );
      return null;
   }


}

Esse código funciona e é belezinha, mas não é o padrão Factory. No máximo é o padrão (Static) Factory Method.

Se retirar o static, ai sim é o Factory.

wesley.comput

Ok. Então avisa o pessoal do GUJ que eles estão postando artigos errados e que vc esta certo.

http://www.guj.com.br/java.tutorial.artigo.137.1.guj

wagnerlegiao

http://www.pg.cefetpr.br/coinf/simone/patterns/factory.php

Criado 19 de maio de 2008
Ultima resposta 5 de set. de 2008
Respostas 9
Participantes 5