[引言]java
咱們在學習軟件開發面向對象編程思想的時候,要深刻理解面向對象的設計思想,就會接觸到一些設計模式。其中單例模式就是一個使用和麪試頻度至關高的設計模式。今天小博老師就爲你們講解單例模式的運用案例。面試
[步驟閱讀一]單例模式的做用編程
咱們首先來製做一個簡單的Java窗體程序,程序啓動後實例化登陸窗體,在登陸窗體中點擊「註冊」按鈕後,會彈出註冊窗體。登陸窗體核心代碼以下:設計模式
package com.bwf.technology.javase.jswing;學習
import java.awt.event.MouseEvent;this
import java.awt.event.MouseListener;設計
import javax.swing.ImageIcon;code
import javax.swing.JButton;對象
import javax.swing.JFrame;blog
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class BWFLogin extends JFrame{
public BWFLogin(){
super("www.51code.com");
setBounds(200, 100, 320, 245);
setLayout(null);
logo = new JLabel(new ImageIcon("files/bwf_logo.png"));
logo.setBounds(10, 10, 281, 75);
this.add(logo);
lb1 = new JLabel("帳戶名稱:");
lb1.setBounds(5, 100, 80, 25);
this.add(lb1);
txtUsername = new JTextField();
txtUsername.setBounds(80, 100, 200, 25);
this.add(txtUsername);
lb2 = new JLabel("帳戶密碼:");
lb2.setBounds(5, 130, 80, 25);
this.add(lb2);
txtPassword = new JPasswordField();
txtPassword.setBounds(80, 130, 200, 25);
this.add(txtPassword);
btLogin = new JButton("登 錄");
btLogin.setBounds(100, 160, 80, 25);
this.add(btLogin);
btRegist = new JButton("注 冊");
btRegist.setBounds(200, 160, 80, 25);
this.add(btRegist);
btRegist.addMouseListener(new MouseListener() {
public void mouseReleased(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {
new BWFRegist();
}
});
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public JLabel logo;
public JLabel lb1;
public JLabel lb2;
public JTextField txtUsername;
public JPasswordField txtPassword;
public JButton btLogin;
public JButton btRegist;
}
註冊窗體的核心代碼以下:
package com.bwf.technology.javase.jswing;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
public class BWFRegist extends JFrame{
public BWFRegist(){
super("歡迎加入博爲峯培訓");
setBounds(300, 150, 300, 300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
若是咱們只是這樣編程程序的話,當用戶屢次點擊註冊按鈕,就會出現多個註冊窗體:
咱們但願只能有一個註冊窗體同一時間存在,當用戶點擊登陸窗體中的「註冊」按鈕後,若是此時沒有註冊窗體,那就實例化一個註冊窗體,而若是此時已經存在了註冊窗體,就返回已經存在的註冊窗體實例。
這個時候,咱們就須要將註冊窗體類設計成單例模式類了,單例模式的做用就是控制一個類同一時間只能存在一個實例。
[步驟閱讀二]單例模式實現
如今咱們修改註冊窗體爲單例設計模式,核心代碼以下:
package com.bwf.technology.javase.jswing;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
public class BWFRegist extends JFrame{
private static BWFRegist instance;
private static String key = "welcome to bwf";
public static BWFRegist getInstance(){
if( instance == null){
synchronized (key) {
if( instance == null ){
instance = new BWFRegist();
}
}
}
return instance;
}
private BWFRegist(){
super("歡迎加入博爲峯培訓");
setBounds(300, 150, 300, 300);
this.addWindowListener(new WindowListener() {
public void windowOpened(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowClosing(WindowEvent e) {
if( instance != null ){
synchronized (key) {
if( instance != null ){
instance.dispose();
instance = null;
}
}
}
}
public void windowClosed(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
});
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
而後對於登陸窗體中「註冊」按鈕的點擊事件稍做修改,把得到註冊窗體實例的代碼修改成:
// new BWFRegist();
BWFRegist.getInstance();
這樣一來,咱們就實現了同一時間,只會有一個註冊窗體存在啦。