java单例模式

来源:互联网 发布:2vb空间日志在线播放 编辑:程序博客网 时间:2024/06/05 10:14

单子模式,顾名思义,就是在整个应用过程中只向外界提供唯一的一份实例。很多时候我们有这样的需求,譬如当我们在计算机上多次点击打开回收站或者某个PPT时,实际只会在我们面前呈现一个窗口。为啥?多开窗口浪费资源造成混乱啦。这就是单子模式的运用。单子模式的JAVA实现有两种形式,看代码:

 

package com.wepull.singleton;

 

/**

 *@authorleno饿汉式单例类

 */

publicclass EagerSingletion {

   privatestatic EagerSingletionsingle =new EagerSingletion();

 

   private EagerSingletion() {

   }

 

   publicstatic EagerSingletion getnSingInstance() {

      returnsingle;

   }

}

package com.wepull.singleton;

 

/**

 *@authorleno懒汉式单例类

 */

publicclassLazySingletion {

   privatestaticLazySingletion single;

 

   private LazySingletion() {

   }

 

   publicstaticLazySingletion getnSingInstance() {

      if (single ==null) {

         single =newLazySingletion();

      }

      returnsingle;

   }

}

 

两种不同实现方式的区别:

<1> 从资源利用的角度看,懒汉式是在调用其静态方法的时候才被实例化的,所以要比饿汉式稍好一些。  

<2> 从反映时间和速度上看,饿汉式在类加载的时候就得到了初始化,所以要比懒汉式好一些。

由上可见,创建一个单子类必须满足以下三个条件:

1.构造器私有

2.自己持有自身的一个静态引用

3.对外面系统提供访问唯一实例的公共静态接口(方法).

 

下面我们看一个足够形象的例子,让大家对单子模式有更深刻的了解

package com.wepull.singleton;

 

import javax.swing.*;

import java.awt.*;

 

/**

 *@authorleno单子模式类

 */

publicclass DemoSingletonextends JFrame {

   //一个私有的,静态的本类对象

   privatestatic DemoSingletontestFrame =new DemoSingleton();

   JLabel jLMes = new JLabel();

 

   //构造必须是私有的,这样其它的类才不能访问

   private DemoSingleton() {

      getContentPane().setLayout(null);

      this.getContentPane().add(jLMes);

      this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

      jLMes.setText("这是产生的唯一窗体");

      jLMes.setBounds(new Rectangle(103, 53, 230, 96));

   }

 

   //公有的静态方法返回一个本类对象

   publicstaticsynchronized DemoSingleton getInstance() {

      returntestFrame;

   }

}

package com.wepull.singleton;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

/**

 *@authorleno测试类

 */

class Testextends JFrame {

   JButton jBtn = new JButton();

 

   public Test() {

      getContentPane().setLayout(null);

      jBtn.setBounds(new Rectangle(125, 182, 168, 43));

      jBtn.setText("单击产生唯一窗体");

 

      this.jBtn.addActionListener(new MyActionListener());

      this.getContentPane().add(jBtn);

      this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

      this.setSize(500, 300);

      this.setVisible(true);

   }

 

   class MyActionListenerimplements ActionListener {

      //单击按钮时调用单子模式类的静态方法,获得一个对象

      publicvoid actionPerformed(ActionEvent e) {

         DemoSingleton testFrame = DemoSingleton.getInstance();

         testFrame.setSize(300, 200);

         testFrame.setVisible(true);

 

      }

   }

 

   publicstaticvoid main(String[] args) {

 

      Test test = new Test();

   }

 

}

本文转自WEPULL许老师,谢谢!
原创粉丝点击