JAVA写的单件模式

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


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();
}

}
...全文
260 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_amao 2011-11-10
  • 打赏
  • 举报
回复
谢谢,启发很大。正好我们学到这了,这下完全明白是怎么回事了
cicigl 2009-11-16
  • 打赏
  • 举报
回复
LSS精辟,让我茅塞顿开啊
GG_wg 2009-11-15
  • 打赏
  • 举报
回复
声明一个常量,需要显示窗口的的个数,在声明一个变量记录当前显示窗口的个数,每次显示显示时先判断变量是否小于等于最大个数,是则new一个窗口且变量++,关闭窗口时--
bayougeng 2009-11-15
  • 打赏
  • 举报
回复
你注意看,唯一的构造方法已经被定义成private了。也就是说,只有自己的方法可以new自己。
public static Singleton instance()
因为不能从外部new这个实例,所以只能开辟一个静态方法。
只要这个实例存在,那么每次访问这个方法,得到的都是同一个实例。这也就是所谓的单例模式。不可能出现第二个实例。
其实加上一个synchronized更好一些。
当然,如果你有另外一个main方法,就另当别论了。
lmdxr 2009-11-15
  • 打赏
  • 举报
回复
简单理解:按照楼主的理解,如果把你的程序同时运行在我这,你那边也运行,岂不是咱们的程序都是相同的?明显是有问题的。
对象为单例是指调用的时候指有一个对象,这只是说明大家在一个运行程序里面,而且你的单例犯了典型的错误,唉。

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


public static Singleton instance()
{
syncronized(this){//可能单词写错了,大概就是这个意思。
if(singleton==null)
singleton = new Singleton();
return singleton;
}
}
Eniak 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bayougeng 的回复:]
单例不是你理解的那样。
Java codepublicstaticvoid main(String[] args)throws Exception{
JFrame f= instance();
f.pack();
f.setVisible(true);

Thread.sleep(2000);

JFrame f2= instance();
f2.setVisible(false);
f2.setTitle("JFrame 2");
f2.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f2.setVisible(true);
}

你运行一下试试。
[/Quote]

似乎明白了一点,是不是应该这样理解,这个对话框的实力实际上在主程序运行之前就已经构造好了,再主程序运行的时候,只要通过 instance()这个方法,任何时候,就一定能得到一个实例,这个实力就是在main之前的那个实例?

但是有一个问题,如果不断地new对象的话,怎么保证实例是唯一的呢?或者说,有人和习惯用new来解决问题,能解决这个问题么?
whut0802 2009-11-14
  • 打赏
  • 举报
回复
呵呵,是一个对话框嘛
hui94781674 2009-11-14
  • 打赏
  • 举报
回复
楼主理解错误了··
bolins 2009-11-14
  • 打赏
  • 举报
回复
一个对话框。
bayougeng 2009-11-14
  • 打赏
  • 举报
回复
单例不是你理解的那样。
    public static void main(String[] args) throws Exception{
JFrame f = instance();
f.pack();
f.setVisible(true);

Thread.sleep(2000);

JFrame f2= instance();
f2.setVisible(false);
f2.setTitle("JFrame 2");
f2.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f2.setVisible(true);
}


你运行一下试试。
zl3450341 2009-11-14
  • 打赏
  • 举报
回复
你代码运行了下
只有一个对话框啊
Eniak 2009-11-14
  • 打赏
  • 举报
回复
你把它放到Eclipse中,运行两次,就是两个实例了
wangwffgqeg 2009-11-14
  • 打赏
  • 举报
回复
就一个对话框呀
laborc1987 2009-11-14
  • 打赏
  • 举报
回复
确实只有一个对象啊
closewbq 2009-11-14
  • 打赏
  • 举报
回复
从哪看出来有两个对话框?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧