Padrão de projeto Singleton com passagem de parämetros

5 respostas
vpmaciel1981

O código funcionou mas,
Estou com dúvidas de como utilizar o padrão de projeto singleton.
Eu preciso passar o objeto Usuario como parâmetro para a Janela

E não sei se é uma forma correta implementar o método para criar o objeto desta forma:

public static synchronized JanelaBanco getInstance(Usuario usuario)

pois só vi até hoje singletons com métodos sem argumentos como
getInstance()

package depto.banco;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Locale;

import javax.swing.JInternalFrame;

import depto.aop.AOP;
import depto.aop.gui.FocusTabListener;
import depto.usuario.Usuario;

@SuppressWarnings("serial")
public class JanelaBanco extends JInternalFrame {

	private BancoHandle bancoHandle;
	private PanelBanco panelBanco;
	private Usuario usuario;
	private static JanelaBanco janelaBanco;
	
	public static synchronized JanelaBanco getInstance(Usuario usuario){
		if (JanelaBanco.janelaBanco == null){
			janelaBanco = new JanelaBanco(usuario) ;		
		}
		
		return janelaBanco;
	}

	private JanelaBanco(final Usuario usuario) {

		super(null, false, true, false, true);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		try {
			this.usuario = usuario;
			AOP.setLocale(getLocale());
			inicializarGui();
			inicializarHandle();
			@SuppressWarnings("unused")
			final FocusTabListener focusTabListener = new FocusTabListener(this);
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}

	public BancoHandle getBancoHandle() {
		return bancoHandle;
	}

	@Override
	public Locale getLocale() {
		return usuario.getLocale();
	}

	public PanelBanco getPanelBanco() {
		return panelBanco;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	private void inicializarGui() {
		setTitle(AOP.getMessage("Bancos"));
		setSize(445, 265);
		setPreferredSize(new Dimension(445, 265));
		setMinimumSize(new Dimension(445, 265));
		setLayout(new BorderLayout());
		panelBanco = new PanelBanco(this);
		add(panelBanco, BorderLayout.CENTER);
		setVisible(true);
	}

	private void inicializarHandle() {
		bancoHandle = new BancoHandle(this);
		panelBanco.inicializarHandle();
		panelBanco.getBancoHandle().carregarReg();
		addInternalFrameListener(bancoHandle.new JanelaHandle());
	}
}
private depto.banco.JanelaBanco janelaBanco;
	janelaBanco = depto.banco.JanelaBanco.getInstance(usuario);

5 Respostas

ViniGodoy

Por que você está tentando passar o usuário para seu Singleton?

Se existe a necessidade de uma janela por usuário, então não é singleton. Singleton representa uma única instância. Não mais.

E

Isso mesmo, como o vini falou, não faz muito sentido chamar o construtor pra passar parâmetros com singleton. É melhor que você crie um método “setUsuario(Usuario user)” para o seu objeto singleton.

Claro, também há aqueles casos em que não se que uma instância, mas sim um número determinado, tipo 4 usuários no máximo, mas até onde eu sei, isso daí é o padrão de projeto para factory, e não singleton. Me corrijam se eu estiver errado.

vpmaciel1981

ViniGodoy:
Por que você está tentando passar o usuário para seu Singleton?

Se existe a necessidade de uma janela por usuário, então não é singleton. Singleton representa uma única instância. Não mais.

Eu preciso do usuário porque quando é feita uma gravação ou leitura no banco de dados
é gravada as informações de data e hora do Usuario.

Eu preciso també da informação do Objeto Locale do usuário.

quando eu chamo AOP.setLocale(getLocale());

vpmaciel1981

Fiz desta forma. Agora acho que é uma decisão aceitável.
Se tiver algo não aceitável agradeço sugestóes.

package depto.banco;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Locale;

import javax.swing.JInternalFrame;

import depto.aop.AOP;
import depto.aop.gui.FocusTabListener;
import depto.usuario.Usuario;

@SuppressWarnings("serial")
public class JanelaBanco extends JInternalFrame {

	private BancoHandle bancoHandle;
	private PanelBanco panelBanco;
	private static Usuario usuario;
	private static JanelaBanco janelaBanco;

	public static synchronized JanelaBanco getInstance() {

		return (JanelaBanco.janelaBanco == null) ? new JanelaBanco()
				: janelaBanco;
	}

	public static void setUsuario(Usuario usuario) {
		JanelaBanco.usuario = usuario;
	}

	private JanelaBanco() {

		super(null, false, true, false, true);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		try {
			AOP.setLocale(getLocale());
			inicializarGui();
			inicializarHandle();
			@SuppressWarnings("unused")
			final FocusTabListener focusTabListener = new FocusTabListener(this);
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}

	public BancoHandle getBancoHandle() {
		return bancoHandle;
	}

	@Override
	public Locale getLocale() {
		return usuario.getLocale();
	}

	public PanelBanco getPanelBanco() {
		return panelBanco;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	private void inicializarGui() {
		setTitle(AOP.getMessage("Bancos"));
		setSize(445, 265);
		setPreferredSize(new Dimension(445, 265));
		setMinimumSize(new Dimension(445, 265));
		setLayout(new BorderLayout());
		panelBanco = new PanelBanco(this);
		add(panelBanco, BorderLayout.CENTER);
		setVisible(true);
	}

	private void inicializarHandle() {
		bancoHandle = new BancoHandle(this);
		panelBanco.inicializarHandle();
		panelBanco.getBancoHandle().carregarReg();
		addInternalFrameListener(bancoHandle.new JanelaHandle());
	}
}
private depto.banco.JanelaBanco janelaBanco;

JanelaBanco.setUsuario(usuario);
janelaBanco = depto.banco.JanelaBanco.getInstance();
vpmaciel1981

ViniGodoy:
Por que você está tentando passar o usuário para seu Singleton?

Se existe a necessidade de uma janela por usuário, então não é singleton. Singleton representa uma única instância. Não mais.

Eu só quero que seja criada a janela cada vrez na aplicação por isso coloquei um Singleton na JIntenalFrame.

Criado 5 de fevereiro de 2011
Ultima resposta 6 de fev. de 2011
Respostas 5
Participantes 3