首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

java se 单例模式有关问题

2012-11-18 
java se 单例模式问题好吧,就这么简单,无法实现单例模式,代码我网上找的,自己修改了下,具体的自己不太懂求

java se 单例模式问题
好吧,就这么简单,无法实现单例模式,代码我网上找的,自己修改了下,具体的自己不太懂
求高人解答

Java code
import java.awt.Color;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.util.HashMap;import java.util.Map;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.border.TitledBorder;public class ColorTest extends JFrame implements ItemListener {  private static final long serialVersionUID = 1L;     //菜单栏     private JMenuBar menubar = new JMenuBar();    private JMenu fileMenu = new JMenu("基本信息设置");    private JMenuItem newMenuItem = new JMenuItem("客户信息设置");    private JMenuItem openMenuItem = new JMenuItem("货运方式设置");    private JMenuItem saveMenuItem = new JMenuItem("联系人设置");    private JMenuItem saveAsMenuItem = new JMenuItem("设备信息设置");    private JMenuItem exitMenuItem = new JMenuItem("员工管理");        private JMenuItem goodsStyle = new JMenuItem("货单类型");    private JMenuItem extraSetting = new JMenuItem("附件设置");        private JMenu configMenu = new JMenu("编辑打印报表");    private JMenuItem backgroudMusicMenu=new JMenuItem("编辑收发货单");    private JMenuItem backColorMenu = new JMenuItem("编辑维修单");        //第一个Jpanel里的内容        JLabel jl1=new JLabel("客户名称");    JCheckBox jcb1=new JCheckBox("查询");        //客户名称    JTextField jt=new JTextField(10);    String str[]={"AAA","BBB","CCC"};    JComboBox JCB=new JComboBox(str);            //客户地址    JLabel jl2=new JLabel("客户地址");    JTextField jf1=new JTextField();        //联系人    JLabel jl3=new JLabel("联系人");    String str2[]={"AAA","BBB","CCC"};    JComboBox JCB2=new JComboBox(str);        //手机    JLabel jl4=new JLabel("手机");    JTextField jtf2=new JTextField();        //联系电话    JLabel jl5=new JLabel("联系电话");    JTextField jtf3=new JTextField();                //功能按钮    JButton jb1=new JButton("清空客户信息");    JButton jb2=new JButton("创建客户");            //单例模式代码    private static Map<String,ColorTest> map = new HashMap<String,ColorTest>();         static{             ColorTest single = new ColorTest();             map.put(single.getClass().getName(), single);        }                           public static void main(String args[]) {  try {   ColorTest single3 = ColorTest.getInstance(null);    } catch (Exception e) {   e.printStackTrace();  } } /**  * Create the frame  */ /** *  */protected ColorTest() {  super("维修单收发货程序");  getContentPane().setLayout(null);  setBounds(40, 40, 900, 660);  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  final JPanel panel = new JPanel();  panel.setBorder(new TitledBorder(null, "客户信息", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, Color.BLUE));  panel.setLayout(null);  panel.setBounds(30, 25, 800, 155);  getContentPane().add(panel);  final JButton button = new JButton();  button.setBounds(84, 74, 106, 28);  button.setText("New JButton");  //panel.add(button);    //上面的Jpanel内容添加    jl1.setBounds(22,10,55,40);  panel.add(jl1);    jcb1.setBounds(85,10,55,40);  panel.add(jcb1);      //菜单栏添加代码    this.setJMenuBar(menubar);    menubar.add(fileMenu);    menubar.add(configMenu);        fileMenu.add(newMenuItem);    fileMenu.add(openMenuItem);    fileMenu.add(saveMenuItem);    fileMenu.add(saveAsMenuItem);        fileMenu.add(exitMenuItem);    fileMenu.add(goodsStyle);    fileMenu.add(extraSetting);        configMenu.add(backgroudMusicMenu);    configMenu.add(backColorMenu);        //下拉菜单1(JPanel)              JCB.setMaximumRowCount(3);     JCB.addItemListener(this);          JCB.setLayout(null);     JCB.setBounds(22,50,200,20);          panel.add(JCB);         //文本框1     jl2.setLayout(null);     jl2.setBounds(260,10,53,43);     panel.add(jl2);          jf1.setLayout(null);     jf1.setBounds(260,50,370,22);     panel.add(jf1);          //下拉菜单3          jl3.setLayout(null);     jl3.setBounds(22,80,53,22);     panel.add(jl3);          JCB2.setMaximumRowCount(3);     JCB2.addItemListener(this);     JCB2.setLayout(null);     JCB2.setBounds(22,110,198,20);     panel.add(JCB2);          //文本框2          jl4.setLayout(null);     jl4.setBounds(260,70,50,50);     panel.add(jl4);          jtf2.setLayout(null);     jtf2.setBounds(260,110,140,20);     panel.add(jtf2);          //文本框3     jl5.setLayout(null);     jl5.setBounds(445,70,70,50);     panel.add(jl5);          jtf3.setLayout(null);     jtf3.setBounds(445,110,185,20);     panel.add(jtf3);          //第一个JPanel的右边2个按钮     jb1.setLayout(null);     jb1.setBounds(650,70,130,30);     panel.add(jb1);                              this.setResizable(false);     this.setVisible(true);   }//单例模式代码public static ColorTest getInstance(String name) {         if(name == null) {            name = ColorTest.class.getName();            System.out.println("name == null"+"--->name="+name);         }        if(map.get(name) == null) {           try {                 map.put(name, (ColorTest) Class.forName(name).newInstance());           } catch (InstantiationException e) {                 e.printStackTrace();            } catch (IllegalAccessException e) {                 e.printStackTrace();            } catch (ClassNotFoundException e) {                e.printStackTrace();            }        }       return map.get(name);    }@Overridepublic void itemStateChanged(ItemEvent e) {    // TODO Auto-generated method stub    }} 



[解决办法]
单例很简单,你的代码很长,高手都很忙,很不耐烦。
你还不如随便找个文档看看清楚,再自己写一个例子。估计不会超过10行。
[解决办法]
看一下这个单例模式代码,比较简单:
public class SingletonTest
{
public static void main(String[] args)
{
Singleton singleton = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();

System.out.println(singleton == singleton2);
}
}


class Singleton
{
private static Singleton singleton;

private Singleton()
{

}

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

return singleton;
}


}
[解决办法]
好吧,在这里我也复习下常见的设计模式:单例模式;
单例模式:顾名思义,就是在类外只有一个该类的实例对象,如果一个类能够多次实例化,就无从谈起单例,所以单例模式首要解决的是new 的问题,在类外,不能使用new创建该类的实例对象,如果类不能实例化了,那么怎么获取对象呢?这就需要类提供一个静态获取固定对象的方法,切记,这个对象是固定的,也就是始终是一个对象。
应用:单例模式的对象一般是使用频度高,或者较为占用资源的类,将其单例化以提高时空的效率;
分类:单例模式,很多时候就是讲一个静态方法提供一个固定对象,但是另外一种常见的方式是与线程绑定的单例模式,一个线程绑定一个类的实例,常见于filter,session,connection中的数据连接处理,事务,或者其他需要与线程进行绑定的情形;
代码1:普通单例
Java code
public class Singeleton2 {    private Singeleton2(){}//私有化构造,类外不能实例化    private static Singeleton2 singlelenton2;//固定的静态实例对象    public static synchronized Singeleton2 getInstance2(){//加锁保证线程安全,确保单例        return singlelenton2==null?(singlelenton2=new Singeleton2()):singlelenton2;    }}
[解决办法]
去看看这里介绍单例模式吧
http://www.cnblogs.com/whgw/archive/2011/10/05/2199535.html

热点排行