小博老師解析Java核心技術 ——單例模式的運用

[引言]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(){

ifinstance == null){

synchronized (key) {

ifinstance == 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) {

ifinstance != null ){

synchronized (key) {

ifinstance != 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();

 

這樣一來,咱們就實現了同一時間,只會有一個註冊窗體存在啦。

相關文章
相關標籤/搜索