Metodos Estaticos e Fabricacao, em ingles Static Factory Methods, servem como alternativa mais inteligivel aos construtores. Construtores sao necessarios, obviamente, mas eles tem um pequeno problema: nao tem nome.Considere uma classe Dado e um objeto instanciado a partir dela. Sabendo que cada Dado tem numero de lados determinado, quantos lados tem este dado:Dado dado = new Dado();dado.joga();System.out.println(dado);Digamos que a implementacao de Dado preveja como padrao 6 lados e de a opcao de construir um Dado com um numero arbitrario de lados (sem validacoes para brevidade):package aps.livro;import static java.lang.Math.random;public class Dado { private int numero; private final int lados; public Dado() { this(6); // cria um dado de seis lados por padrao } public Dado(int lados) { this.lados = lados; } public int getNumero() { return numero; } public int getLados() { return lados; } public void joga() { numero = (int) (random() * lados + 1); } @Override public String toString() { return String.valueOf(numero); } }Mesmo que instanciemos o Dado passando lados, quem le apenas a construcao e nao tem acesso ao codigo-fonte nao pode afirmar com certeza o significado do parametro, veja a seguir:Dado dado = new Dado(10);dado.joga();System.out.println(dado);E intuitivo pensar que Dado(10) e um Dado com 10 lados, mas nao e algo implicito.Embora eu programe com mais frequencia em Java, tambem estou atento e programo em outras linguagens, que me faz melhor como programador Java. Como assim? Bem, aprender diferentes culturas de implementacao te ajudam a ver os problemas de mais pontos de vista. Um ditado presente no Zen do Python diz:Explicit is better than implicitNesta implementacao do Dado, o construtor e implicito, ou seja, nos deduzimos que Dado(10) e um Dado com *dez* lados pois esta implicito.Que tal tornar explicito? Nao e complicado, basta adicionar um metodo fabrica. Veja exemplo:package aps.livro;import static java.lang.Math.random;public class Dado { private int numero; private final int lados; // metodo para fabricacao de Dados public static Dado lados(int lados) { return new Dado(lados); } public Dado() { this(6); // cria um dado de seis lados por padrao } public Dado(int lados) { this.lados = lados; } public int getNumero() { return numero; } public int getLados() { return lados; } public void joga() { numero = (int) (random() * lados + 1); } @Override public String toString() { return String.valueOf(numero); } }A grande vantagem de um metodo fabrica e que ele tem nome e com nome ele demonstra a intencao explicitamente. Veja uma situacao de uso:Dado dado = Dado.lados(10); // bem mais claro, certodado.joga();System.out.println(dado);Ainda e possivel predefinir construcoes comuns com metodos sem parametros, por exemplo, dados de 6, 10 e 20 lados.package aps.livro;import static java.lang.Math.random;public class Dado { private int numero; private final int lados; public static Dado lados(int lados) { return new Dado(lados); } // metodos de fabricacao com parametro constante public static Dado deSeisLados() { return lados(6); } public static Dado deDezLados() { return lados(10); } public static Dado deVinteLados() { return lados(20); } // ... restante omitidoVeja a clareza que fica:Dado dado = Dado.deDezLados(); // bem mais claro que: new Dado(10)dado.joga();System.out.println(dado);Mais detalhes podem ser vistos no livro do Josh Bloch:http://www.submarino.com.br/produto/6800218/livro-java-efetivoVale a pena