所谓单例模式,举一些简单的例子:当我们使用一个音乐播放器听音乐时,如果已经在播放一首音乐,那么就无法再播放另一首音乐;又比如,查看PPT时,永远无法在播放PPT的主页面同时查看多个PPT页面。
要想实现单例模式,就是要想方设法让外界不能随意创建新的对象,即不对外提供公开的构造器(将构造器私有化)。既然构造器被私有化了,我们无法通过new一个构造器来创建对象,因此就需要在内部公开一个方法来获取一个对象。下面通过简单的代码来解释单例模式:
单例模式分为两种,一种是懒汉模式,另一种是饿汉模式。
(1)懒汉模式举例:
package 单例模式;
/**
* 懒汉模式
* @author lenovo
*
*/
public class Singleton {
private static Singleton instance;//创建一个Singleton的临时变量
//将构造器私有化
private Singleton(){}
//提供一个公开的方法来获取对象
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
针对懒汉模式的测试类:
package 单例模式;
public class test {
public static void main(String[] args) {
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
Singleton s3=Singleton.getInstance();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
结果截图:
【分析】通过结果可知,s1,s2,s3的地址是一模一样的,即实际上s1,s2,s3是同一个对象,也就实现了单例模式。
(2)饿汉模式举例:
针对饿汉模式的test类:package 单例模式; /** * 饿汉模式 * @author lenovo * */ public class Singleton { private static Singleton instance=new Singleton();//创建一个Singleton的临时变量 //将构造器私有化 private Singleton(){} //提供一个公开的方法来获取对象 public static Singleton getInstance(){ if(instance==null){ //如果临时变量为空,即不存在Singleton对象, //此时创建一个Singleton对象,并将其赋值给临时变量 instance=new Singleton(); } return instance; } }
package 单例模式; public class test { public static void main(String[] args) { Singleton s1=Singleton.getInstance(); Singleton s2=Singleton.getInstance(); Singleton s3=Singleton.getInstance(); System.out.println(s1); System.out.println(s2); System.out.println(s3); } }
结果截图:
【分析】饿汉模式也实现了单例模式,使得无论何时都只能创建一个对象,与懒汉模式相比,唯一的不同之处在于创建临时
对象时就new了一个对象