日期:2014-05-20  浏览次数:20676 次

JAVA写的单件模式
我看了一个软件,上面提到了单件模式,自己写了一个,就是一个对话框,这个类有个变量 a,点击一次按钮,就把变量加一。
基本上是按照单件模式写的,但是,怎么能有运行起来两个对话框呢,单件模式不是只有一个实例么,而且,两个对话框的变量都不同啊,一个实例怎么会这样呢?

Java code

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;



public class Singleton extends JFrame
{

    int a = 1;
    private JTextField titleField;
    
    private static Singleton singleton=null;
    
    private JButton jb;

    private Singleton()    {
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(3,1));
        p.add(new JLabel("Book title:"));
        this.titleField = new JTextField(15);
        this.jb = new JButton();
        p.add(this.titleField);
        jb.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                try {
                    a++;
                    String s = new String();
                    Integer i = new Integer(a);
                    titleField.setText(i.toString());
                }
                catch (Exception e) {
                }
            }
        });
        p.add(jb);
        Integer i = new Integer(a);
        titleField.setText(i.toString());
        this.add(p);
    }

    public static Singleton instance()
    {
        if(singleton==null)
            singleton = new Singleton();
        return singleton;
    }

    
    public static void main(String[] args) {
          instance().show();
    }

}



------解决方案--------------------
你注意看,唯一的构造方法已经被定义成private了。也就是说,只有自己的方法可以new自己。
 public static Singleton instance()
因为不能从外部new这个实例,所以只能开辟一个静态方法。
只要这个实例存在,那么每次访问这个方法,得到的都是同一个实例。这也就是所谓的单例模式。不可能出现第二个实例。
其实加上一个synchronized更好一些。
当然,如果你有另外一个main方法,就另当别论了。