1、首先介紹一下什麼是單例模式:
java單例模式是一種常見的設計模式,那麼我們先看看懶漢模式:
public class Singleton_ {
//設為私有方法,防止被外部類引用或實例
private Singleton_(){
System.out.println("懶漢單例模式");
}
private static Singleton_ single = null;
//並對外只暴露getInstance()方法,這是獲取唯一實例方法。
public static Singleton_ getInstance(){
if(single==null)
single = new Singleton_();
return single;
}
}
這是沒有考慮線程安全問題的,因為在線程並發的情況下,容易有多個實例,所以這是個線程不安全的模式。還有像餓漢模式這樣的:
//餓漢式單例類.在類初始化時,已經自行實例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//對外只暴露getInstance()方法,這是獲取唯一實例方法。
public static Singleton1 getInstance() {
return single;
}
}
這個模式在類初始化的時候就已經實例化了,保證了唯一一個實例,這是線程安全的。
2、簡單了解了什麼是單例模式後,我們來用一個具體實例看看,怎麼樣實現在JFrame界面切換的時候可以只有一個主窗體,而不需要,不停地實例化和銷毀它。
主類繼承JFrame,所以直接實例化本類並顯示就可以了。
1 import javax.swing.JFrame;
2
3 public class Singleton_ extends JFrame{
4 private static Singleton_ single = null;
5 //對外只暴露getInstance()方法,這是獲取唯一實例方法。
6 public static Singleton_ getInstance(){
7 if(single==null)
8 single = new Singleton_();
9 return single;
10 }
11 public static void main(String args[]){
12 Singleton_ singleton_ = new Singleton_();//實例化唯一窗口與
13 singleton_.setTitle("單例模式窗口");
14 singleton_.setVisible(true);
15 }
16 //設為私有方法,防止被外部類引用或實例
17 private Singleton_(){
18 setBounds(100, 100, 461, 286);
19 setContentPane(Panel_01.getInstance(this));
20 }
21 }
這是一個JPanel面板類,他也是一個單例模式,返回的是一個JPanel實例。
1 import java.awt.event.ActionEvent;
2 import java.awt.event.ActionListener;
3
4 import javax.swing.JButton;
5 import javax.swing.JFrame;
6 import javax.swing.JPanel;
7
8 public class Panel_01 extends JPanel{
9 private JButton but_01;
10 private JPanel jPanel;
11 private Panel_01(final JFrame jFrame){
12 setLayout(null);
13 System.out.println("正常");
14 but_01 = new JButton("界面1");
15 //點擊事件
16 but_01.addActionListener(new ActionListener() {
17
18 @Override
19 public void actionPerformed(ActionEvent e) {
20 if(e.getSource()==but_01){
21 jFrame.setContentPane(Panel_02.getInstance(jFrame));
22 jFrame.validate();//使面板生效,刷新
23 }
24 }
25 });
26 but_01.setBounds(120, 45, 71, 28);
27 jPanel = new JPanel();
28 jPanel.setLayout(null);
29 jPanel.setBounds(0, 76, 450, 224);
30 jPanel.add(but_01);
31 add(jPanel);
32 }
33 private static Panel_01 panel_01 = null;
34 public static Panel_01 getInstance(JFrame jFrame){
35 panel_01 = new Panel_01(jFrame);
36 return panel_01;
37 }
38 }
第二個JPanel類
1 import java.awt.event.ActionEvent;
2 import java.awt.event.ActionListener;
3
4 import javax.swing.JButton;
5 import javax.swing.JFrame;
6 import javax.swing.JLabel;
7 import javax.swing.JPanel;
8
9 public class Panel_02 extends JPanel{
10 private JLabel jLabel = null;
11 private JButton but_02 = null;
12 //私有方法
13 private Panel_02(JFrame jFrame){
14 jLabel = new JLabel("界面1");
15 jLabel.setBounds(0, 0, 100, 100);
16 but_02 = new JButton("返回");
17 //點擊事件
18 but_02.addActionListener(new ActionListener() {
19
20 @Override
21 public void actionPerformed(ActionEvent e) {
22 if(e.getSource()==but_02){
23 jFrame.setContentPane(Panel_01.getInstance(jFrame));
24 jFrame.validate();//刷新
25 }
26 }
27 });
28 jLabel.setBounds(100, 100, 100, 100);
29 add(but_02);
30 add(jLabel);
31 }
32 private static Panel_02 panel_02=null;
33 //對外接口
34 public static Panel_02 getInstance(JFrame jFrame){
35 panel_02 = new Panel_02(jFrame);
36 return panel_02;
37 }
38 }
本個案例主要實現了類只有一個JFrame窗口,而在使用功能的時候,只有裡面的JPanel面板不斷的切換,不影響主窗體的狀態。而且一般這種類型的界面最好都是采用單例模式會好一點。(這是本人第一次寫博客,有不好的地方歡迎大家指出,我會不斷改進更新的,謝謝!)