[引言]
我们在学习软件开发面向对象编程思想的时候,要深入理解面向对象的设计思想,就会接触到一些设计模式。其中单例模式就是一个使用和面试频度相当高的设计模式。今天小博老师就为大家讲解单例模式的运用案例。
[步骤阅读一]单例模式的作用
我们首先来制作一个简单的Java窗体程序,程序启动后实例化登录窗体,在登录窗体中点击“注册”按钮后,会弹出注册窗体。登录窗体核心代码如下:
packagecom.bwf.technology.javase.jswing;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPasswordField;
importjavax.swing.JTextField;
publicclassBWFLoginextendsJFrame{
publicBWFLogin(){
super("www.51code.com");
setBounds(200, 100, 320, 245);
setLayout(null);
logo=newJLabel(newImageIcon("files/bwf_logo.png"));
logo.setBounds(10, 10, 281, 75);
this.add(logo);
lb1=newJLabel("账户名称:");
lb1.setBounds(5, 100, 80, 25);
this.add(lb1);
txtUsername=newJTextField();
txtUsername.setBounds(80, 100, 200, 25);
this.add(txtUsername);
lb2=newJLabel("账户密码:");
lb2.setBounds(5, 130, 80, 25);
this.add(lb2);
txtPassword=newJPasswordField();
txtPassword.setBounds(80, 130, 200, 25);
this.add(txtPassword);
btLogin=newJButton("登 录");
btLogin.setBounds(100, 160, 80, 25);
this.add(btLogin);
btRegist=newJButton("注 册");
btRegist.setBounds(200, 160, 80, 25);
this.add(btRegist);
btRegist.addMouseListener(newMouseListener() {
publicvoidmouseReleased(MouseEvente) {}
publicvoidmousePressed(MouseEvente) {}
publicvoidmouseExited(MouseEvente) {}
publicvoidmouseEntered(MouseEvente) {}
publicvoidmouseClicked(MouseEvente) {
newBWFRegist();
}
});
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicJLabellogo;
publicJLabellb1;
publicJLabellb2;
publicJTextFieldtxtUsername;
publicJPasswordFieldtxtPassword;
publicJButtonbtLogin;
publicJButtonbtRegist;
}
注册窗体的核心代码如下:
packagecom.bwf.technology.javase.jswing;
importjava.awt.event.WindowEvent;
importjava.awt.event.WindowListener;
importjavax.swing.JFrame;
publicclassBWFRegistextendsJFrame{
publicBWFRegist(){
super("欢迎加入博为峰培训");
setBounds(300, 150, 300, 300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
如果我们只是这样编程程序的话,当用户多次点击注册按钮,就会出现多个注册窗体:
我们希望只能有一个注册窗体同一时间存在,当用户点击登录窗体中的“注册”按钮后,如果此时没有注册窗体,那就实例化一个注册窗体,而如果此时已经存在了注册窗体,就返回已经存在的注册窗体实例。
这个时候,我们就需要将注册窗体类设计成单例模式类了,单例模式的作用就是控制一个类同一时间只能存在一个实例。
[步骤阅读二]单例模式实现
现在我们修改注册窗体为单例设计模式,核心代码如下:
packagecom.bwf.technology.javase.jswing;
importjava.awt.event.WindowEvent;
importjava.awt.event.WindowListener;
importjavax.swing.JFrame;
publicclassBWFRegistextendsJFrame{
privatestaticBWFRegistinstance;
privatestaticStringkey="welcome to bwf";
publicstaticBWFRegist getInstance(){
if(instance==null){
synchronized(key) {
if(instance==null){
instance=newBWFRegist();
}
}
}
returninstance;
}
privateBWFRegist(){
super("欢迎加入博为峰培训");
setBounds(300, 150, 300, 300);
this.addWindowListener(newWindowListener() {
publicvoidwindowOpened(WindowEvente) {}
publicvoidwindowIconified(WindowEvente) {}
publicvoidwindowDeiconified(WindowEvente) {}
publicvoidwindowDeactivated(WindowEvente) {}
publicvoidwindowClosing(WindowEvente) {
if(instance!=null){
synchronized(key) {
if(instance!=null){
instance.dispose();
instance=null;
}
}
}
}
publicvoidwindowClosed(WindowEvente) {}
publicvoidwindowActivated(WindowEvente) {}
});
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
然后对于登录窗体中“注册”按钮的点击事件稍作修改,把获得注册窗体实例的代码修改为:
//new BWFRegist();
BWFRegist.getInstance();
这样一来,我们就实现了同一时间,只会有一个注册窗体存在啦。