O padrão Static Factory Method é, em geral, uma alternativa melhor ao uso de construtores. Permite criar os objetos sem expor a forma de criação ou carecer do uso do operador new
. Podemos entender este padrão como uma forma de construtor nomeado em que podemos dar um nome ao construtor e portanto um significado aos seus comportamento e parâmetros.
Além disso permite que modifiquemos a forma de criação ou incluamos mecanismos de cache.
++ Exemplos na API padrão
Existem muitos exemplos na API padrão do uso de Static Factory Method principalmente nos objetos wrapper como Integer
e BigDecimal
através dos métodos valueOf
. No caso de Integer
existe até um mecanismo de cache de valores que auxiliar a aumentar a performance das operações de auto-boxing.
As classes Calendar
e Locale
também fazem uso de Static Factory Method através dos métodos getInstance
.
A partir do Java 5 foi incluída a funcionalidade de Enumerações. Todas as enumarações contam com métodos valueOf()
que são implementações de Static Factory Method.
Finalmente, um caso mais interessante do uso de Static Factory Method é o método valueOf
da classe Boolean
. Este método apenas retorna Boolean.TRUE
ou Boolean.FALSE
e a única coisa que ele faz é decidir qual, algo assim:
public Boolean valueOf(boolean value){
return value ? Boolean.TRUE : Boolean.FALSE;
}
Este método parece que vai criar um objeto, mas na realidade não o faz. Utilizar este método em vez de new Boolean(value)
preserva a JVM de ficar criando e destruindo um monte de objetos iguais melhorando a performance da aplicação e demonstra perfeitamente que o uso de Static Factory Method não está apenas vinculado ao ato de criar, mas principalmente ao ato de simular a criação. Algo que com new
, não podemos fazer.
O uso de Static Factory Method nas classes wrapper na biblioteca padrão foram adicionados vários anos depois da criação original das classes. Até ha pouco tempo, isto significava que nunca poderiamos tornar os construtores privados e forçar o uso dos métodos criadores que contém otimizações de performance e cache. Recentemente, por causa do projeto Valhalla os construtores estão sendo tornados obsoletos e eventualmente serão removidos. Esta é uma decisão que afeta muitos desenvolvedores e que está sendo tomada agora de uma forma destrutiva. Este é um exemplo da razão pela que devemos sempre presar pelo encapsulamento de decisões, especialmente a decisão de instanciação e usar new
diretamente o menos possível.