Uso do padrão de criação Singleton para que, ao tentar instânciar mais de uma de impresora, o Gerenciador de impressão acabe sempre obtendo a mesma instância da classe Impressora. Desta forma, cada página de impressão é enviada para a mesma impressora de destino.
Demonstrar que este padrão permite que uma classe instancie apenas um único objeto Impressora. Sendo um exemplo simplificado de um gerenciador de impressão real, que deve acionar a mesma impressora para realiziar alguma impressão.
Método main:
Impressorap1 = newImpressora();
Impressorap2 = newImpressora();
Impressorap3 = newImpressora();
Impressorap4 = newImpressora(); System.out.println("Endereço de memória de p1: "+p1);
System.out.println("Endereço de memória de p2: "+p2);
System.out.println("Endereço de memória de p3: "+p3);
System.out.println("Endereço de memória de p4: "+p4);Saída:
Endereçodememóriadep1: modelo.Impressora@15db9742Endereçodememóriadep2: modelo.Impressora@6d06d69cEndereçodememóriadep3: modelo.Impressora@7852e922Endereçodememóriadep4: modelo.Impressora@4e25154fCada tentativa de instanciar uma Impressora acabou retornando um endereço de memória diferente, com isto podemos observar que foram criadas quatro instâncias.
Classe Impressora no padrão Singleton:
publicclassImpressora {
privatestaticImpressoraimpressora;
privateImpressora() {
}
publicstaticImpressoragetInstance() { if(impressora == null) {
impressora = newImpressora();
}
returnimpressora;
}
}Torna-se o construtor private, cria-se um atributo private e static do tipo da classe, pois será referenciado por um método public e também static chamado getInstance(). Este método analisa se o atributo impressora é null.
Caso seja, irá instanciar a classe Impressora e atribuir a impressora e então retorna este atributo. Caso impressora ja pussua o objeto Impressora, o método irá apenas retornar o atributo.
Método main:
Impressorap1 = Impressora.getInstance();
Impressorap2 = Impressora.getInstance();
Impressorap3 = Impressora.getInstance();
Impressorap4 = Impressora.getInstance();
System.out.println("Endereço de memória de p1: "+p1);
System.out.println("Endereço de memória de p2: "+p2);
System.out.println("Endereço de memória de p3: "+p3);
System.out.println("Endereço de memória de p4: "+p4);Saída:
Endereçodememóriadep1: modelo.Impressora@15db9742Endereçodememóriadep2: modelo.Impressora@15db9742Endereçodememóriadep3: modelo.Impressora@15db9742Endereçodememóriadep4: modelo.Impressora@15db9742Para as quatro tentativas de instanciar a classe Impressora, pode-se observar que o endereço de memória é sempre o mesmo. Isto significa que, uma vez instanciado, o objeto a ser manipulado é sempre o mesmo.