Olá. Desta vez escrevo sobre um padrão de projeto para programação Orientada a Objetos, também muito
conhecido: O Singleton. Esse padrão, quando aplicado ao projeto de software OO, visa que se
utilize o objeto de uma determinada classe em qualquer parte do sistema, com a garantia que esse a
classe desse objeto só é instanciada uma vez.
A idéia é, primeiramente, criar um construtor privado na classe para impedir a instanciação direta da mesma através
do operador "new", chamado fora do escopo da classe e, depois, criar um método estático que retorna a
única instância criada da classe. Veja o diagrama abaixo:
Perceba que o método "getInstance" é estático, assim como, também, o atributo
privado "instance". O atributo "instance" representa a única instância
da classe. Agora, veja abaixo qual a lógica do singleton na classe Singleton:
class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if ( instance == null )
instance = new Singleton();
return instance;
}
public void algumMetodo() {
}
}
public class Main {
public static void main(String[] args) {
Singleton.getInstance().algumMetodo();
}
}
Esta é a implementação mais básica do singleton, onde, o método "getInstance" instancia
a classe Singleton, apenas, se a mesma ainda não foi instanciada nenhuma vez e retorna a instância.
Caso contrário, apenas retorna a única instância.
O método algumMetodo é apenas um método qualquer da classe singleton que pode ser chamado em qualquer
parte do sistema através da chamada: Singleton.getInstance().algumMetodo();.
Singleton para player de audio
Agora, vamos a um exemplo mais interessante: Um player de áudio. Esse player de áudio
é um programa de linha de comandos que recebe um argumento: o caminho de um arquivo de música
em formato ".wav". Caso, nenhum argumento seja passado, o programa assume que no diretório
atual da linha de comandos tem um arquivo de nome: "picapau.wav" e toca ele. Veja o código fonte da
classe principal:
package singleton;
import javax.swing.JOptionPane;
import singleton.audio.AudioPlayer;
public class Main {
public static void main(String[] args) {
String audio = "picapau.wav";
if ( args.length == 1 )
audio = args[ 0 ];
try {
AudioPlayer.getInstance().play( audio );
} catch (RuntimeException ex) {
JOptionPane.showMessageDialog( null, ex.getMessage() );
}
}
}
No programa acima, se o número de argumentos for 1, então, é passado para o player de áudio, a
string correspondente ao valor do argumento. Caso, contrário, é passado para o player de áudio
a string "picapau.wav".
Agora, repare na seguinte chamada: AudioPlayer.getInstance().play( audio );. Claramente,
podemos perceber aqui que a classe AudioPlayer é uma classe Singleton. E, o método
"play", toca o áudio.
Veja abaixo o código fonte da classe AudioPlayer:
package singleton.audio;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class AudioPlayer {
private static AudioPlayer instance = null;
private AudioPlayer() {}
public static AudioPlayer getInstance() {
if ( instance == null )
instance = new AudioPlayer();
return instance;
}
public void play( String arquivoAudio ) throws Exception {
try {
InputStream in = new FileInputStream( arquivoAudio );
InputStream bufIn = new BufferedInputStream( in );
AudioInputStream ain = AudioSystem.getAudioInputStream( bufIn );
Clip clip = AudioSystem.getClip();
clip.open( ain );
clip.start();
Thread.sleep( clip.getMicrosecondLength() / 1000 );
clip.close();
} catch ( UnsupportedAudioFileException ex ) {
throw new Exception( "Formato de arquivo de áudio não suportado." );
} catch ( LineUnavailableException ex ) {
throw new Exception( "Erro na abertura do arquivo de áudio." );
} catch ( FileNotFoundException ex ) {
throw new Exception( "\""+arquivoAudio+"\"\nArquivo não encontrado." );
} catch ( IOException ex ) {
throw new Exception( "Erro na leitura do arquivo de áudio." );
}
}
}
Observe primeiramente o método "getInstance", a variável privada e estática
"instance" e o construtor privado como o único na classe. São características
de uma classe Singleton!
Agora, você pode entender como a chamada ao método "play" no método principal funciona.
Mas, entenda também que a classe AudioPlayer tem, de fato, o método de nome "play"
que recebe o caminho do arquivo de áudio para tocar.
O método "play"
Pronto! Vamos agora focar no método "play" para entender como ele funciona. Perceba que há a
possibilidade de uma exceção tipo Exception ser lançada com uma mensagem personalizada e
capturada no método principal. O ideal era criar uma classe de exceção personalizada. Mas, por
questões de simplicidade, utilizei a classe Exception mesmo. Se uma exception é lançada pelo
método "play", é mostrada uma janelinha com a mensagem personalizada.
Singleton com multithreading
Como o singleton utiliza um atributo e um método estático, talvez não seja uma boa idéia utilizar
essa solução em um ambiente concorrente.
O download do código fonte
Abaixo o link de download do código fonte do projeto que toca um áudio.
Link de download:
singleton-exemplo.zip
Após baixar o projeto, você pode compilar se estiver com o JDK. Então, use a linha de
comandos para entrar na pasta base do projeto descompactado e utilize o seguinte comando
para compilar:
javac -d bin src/singleton/*.java src/singleton/audio/*.java
Agora para rodar, basta utilizar o seguinte comando:
java -cp bin singleton.Main oi-meu-chapa.wav
No comando acima, você pode passar qualquer arquivo de áudio em formato ".wav" no
lugar de "oi-meu-chapa.wav". Se não passar o arquivo, o "picapau.wav" é
executado por padrão, conforme o comando abaixo:
java -cp bin singleton.Main
Finalizando...
Esse é o final de mais um artigo sobre padrões de projeto. Desta vez, o
padrão singleton foi discutido aqui. Espero que tenham
gostado e, até o próximo!
1463
Escrito por:
Ítalo Herbert
Última alteração feita em:
25/10/2024 19:48:47
Tags relacionadas:
singleton, padrão, design, pattern, java, prog, programação, refactoring,
qualidade, código
Você também pode gostar:
Padrão DecoratorDesenho da bandeira do BrasilDesenhando em JavaPrincípios SOLIDPadrão Observer
Deixe seu comentário
Nome:
E-Mail:
Comentario: obrigatório
Mostrar na lista de comentários
Código de verificação:
Digite o código: obrigatório
Enviar
Limpar
Comentários postados: Nenhum comentario visível postado até o momento, deixe o seu!
Política de privacidade
Produzido por Ítalo Herbert
0
o( decorator, 75, Color.RED );
Decoradores de desenhos - Bandeira do Japão
Abaixo o link de download do código fonte do projeto que desenha uma bandeira.
Link de download:
decorator-exemplo.zip
Após baixar o projeto, você pode compilar se estiver com o JDK. Então, use a linha de comandos
para entrar na pasta base do projeto descompactado e utilize o seguinte comando para compilar:
javac -d bin src/bandeira/desenho/*.java src/bandeira/*.java
Agora para rodar, basta utilizar o seguinte comando:
java -cp bin bandeira.BandeiraMain
Baixe, compile e rode o projeto e experimente adicionar novos decoradores, ou remover
decoradores encadeados ou, mesmo, alterar a ordem das instâncias e teste novamente para
ver que gráfico é gerado!
Finalizando...
Esse é o final de mais um artigo sobre padrões de projeto. Desta vez, o
padrão decorator foi discutido aqui. Espero que tenham
gostado e, até o próximo!
1435
Escrito por:
Ítalo Herbert
Última alteração feita em:
25/10/2024 19:37:57
Tags relacionadas:
decorator, prog, programação, java, padrão, design, patterns,
qualidade, código
Você também pode gostar:
Padrão ObserverDesenho da bandeira do BrasilPrincípios SOLIDPadrão SingletonDesenhando em Java
Deixe seu comentário
Nome:
E-Mail:
Comentario: obrigatório
Mostrar na lista de comentários
Código de verificação:
Digite o código: obrigatório
Enviar
Limpar
Comentários postados: Nenhum comentario visível postado até o momento, deixe o seu!
Política de privacidade
Produzido por Ítalo Herbert
0