JAVA写的单件模式解决办法
JAVA写的单件模式
我看了一个软件,上面提到了单件模式,自己写了一个,就是一个对话框,这个类有个变量 a,点击一次按钮,就把变量加一。
基本上是按照单件模式写的,但是,怎么能有运行起来两个对话框呢,单件模式不是只有一个实例么,而且,两个对话框的变量都不同啊,一个实例怎么会这样呢?
------解决方案--------------------
你注意看,唯一的构造方法已经被定义成private了。也就是说,只有自己的方法可以new自己。
public static Singleton instance()
因为不能从外部new这个实例,所以只能开辟一个静态方法。
只要这个实例存在,那么每次访问这个方法,得到的都是同一个实例。这也就是所谓的单例模式。不可能出现第二个实例。
其实加上一个synchronized更好一些。
当然,如果你有另外一个main方法,就另当别论了。
我看了一个软件,上面提到了单件模式,自己写了一个,就是一个对话框,这个类有个变量 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方法,就另当别论了。