单例模式

是什么?

       单例,"单"就是一个,"例"就是实例,”单例“就是说”一个类只有一个实例,且自行实例化向整个系统提供“。


为什么? 

       为什么要使用单例模式呢?换句话说,为什么一定要确保一个类只有一个实例呢?通过下面这个例子来看:

       QQ,当你想和某个朋友聊天时,在好友列表中找到该好友,鼠标双击,就会打开对话窗口(从程序角度说:捕捉到你双击事件时会实例化出一个窗口对象)。当窗口打开后,你再去双击该好友时,观察是否还会再打开一个新的窗口,答案是否定的。在这种情况下,只能允许实例化一个同一窗口的对象。【QQ实际上可能不是这样实现的,我只是想举这么一个例子】同样机理的还有打印机,同一时刻只能执行一个打印任务,等等。


怎么样?

     这么样实现呢?其实单例实现有很多方法,下面只给出比较高效的一种:

    

package test;
/**
 * 单例模式.
 * @author nagsh
 *
 */
public class Singleton {
	//将该类的实例(即对象)声明为静态的
    public static Singleton singleton = null;
    //空构造方法--私有
	private Singleton() {
	}
    //对象生成器
    public void getInstance(){
    	//如果对象为null,进行实例化
    	if(singleton == null){
    		//锁机制,当有多个线程同时访问时,必须等前一个线程释放锁后才可以执行
    		 synchronized(Singleton.class){
    			 //需再判断一次--如果上一个线程已经实例化了,就没必要再实例化了
                 if(singleton==null){
                	 singleton=new Singleton();
                 }
             }
    	}
    }
}
当外部类需要该类对象的时候不是实例化,而是通过调用getInstance()方法获取实例,而原本默认public的构造方法由于被覆盖成了private的,所以外部类其实也无法调用它的构造方法去实例化。



版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/dingxiaoyue/p/4931744.html