Padrão Factory

A criação de objetos pode ser algo extremamente complicado tanto que há vários padrões de projetos que tentam resolver de forma elegante e padronizada alguns destes problemas. Estes padrões de projetos são chamados de padrões de criação. A linguagem Java utiliza alguns destes padrões em várias APIs, hoje vamos discutir um pouco do padrão Factory.

No Java 7 fomos introduzidos à um conjunto de APIs denominada NIO.2 que define interfaces e classes para manipulação de arquivos. Em especial, a versão introduziu a interface java.nio.file.Path que visa substituir a API java.io.File para manipulação de arquivos.

Quando trabalhamos com sistemas de arquivos, temos de manipular arquivos e diretórios, seja por caminhos absolutos ou relativos, mas também temos diversas particularidades entre um sistema de arquivos e outro. Por exemplo, no Linux o caminho é absoluto se ele começar com / mas no Windows isso não é verdade. No Windows, o caminho é absoluto se ele começar com uma referência à uma partição, algo como C:.

É por esta razão que a API criada nos disponibiliza uma interface ao invés de uma classe. A implementação irá variar de sistema de arquivos para sistema de arquivos. Sendo assim, Como podemos escrever um código que cria objeto cujo o tipo específico só poderá ser conhecido em tempo de execução?

Seria uma complexidade desnecessária deixar a responsabilidade para o desenvolvedor e para simplificar a criação de uma instância de java.io.file.Path foi criada uma fábrica de Path chamada java.io.file.Paths.

Path path1 = Paths.get("C:\\lucas");		
Path path2 = Paths.get("/home/lucas");

System.out.println(path1.isAbsolute());
System.out.println(path2.isAbsolute());

//Output no Linux:
//false
//true

Perceba que o resultado deste método vai depender do sistema de arquivos sob o qual a JVM está executando e toda a complexidade possivelmente envolvida na criação de cada objeto Path é encapsulada pela fábrica.Algumas características de fábricas no Java são a utilização de métodos estáticos. Alguns exemplos de fábricas são java.nio.file.FileSystems e java.util.concurrent.Executors.

Perceba que existe uma nomenclatura comum nestas classes que terminam com um s no final. Mas isso não é um padrão. Ainda no NIO.2 temos uma classe java.nio.file.Files que é considerada uma classe utilitária. Classes utilitárias também são compostas por métodos estáticos mas diferem das fábricas por não criar objetos mas por manipular ou criar novos objetos de instâncias existentes.

Path path = Paths.get("/home/lucas");
Files.exists(path);

//Output no Linux:
//true

No exemplo acima, utilizamos a classe Files para chamar o método estático exists que opera em instâncias de java.nio.file.Path para verificar se o arquivo/diretório existe no sistema de arquivos.

Considerações finais

Reconhecer os padrões de projetos utilizados na linguagem é uma ótima forma de melhorar suas atividades de codificação. O padrão Factory é utilizado desde APIS SE até EE. Neste technote discutimos um pouco sobre a aplicação do padrão Factory na API NIO.2 e apresentamos algumas as operações que você costumava fazer com java.io.File e que é possível realizar de forma mais simplificada com esta API.

Até mais!

Anúncios
%d blogueiros gostam disto: