Singleton模式
在程序运行的时候常常是使用new
的方法创建一个实例。对于某一个类(例如工具类),如果我们希望在任何情况下该类只有一个实例的话,我们需要使用单例模式。单例模式是很简单又被广为使用的一个设计模式:
public class Singleton {
//饿汉模式
private static Singleton singleton = new Singleton();
private Singleton(){
System.out.println("生成唯一的实例");
}
public static Singleton getSingleton(){
return singleton;
}
}
在程序运行时,当Singleton
首次被加载的时候,我们即创建了一个singleton
对象。当getSingleton
函数被调用的时候,我们将这个对象的引用返回给外部调用。这样的话,不管调用多少次,getSingleton
函数返回的总是类加载时创建的singleton
对象。
可使用Main
中的函数判断两个实例是否为同一个对象:
public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getSingleton();
Singleton s2 = Singleton.getSingleton();
System.out.println(s1==s2?"s1 和 s2 相同":"s1 和 s2 不相同");
}
}
生成唯一的实例
s1 和 s2 相同
上面的方法又被称为饿汉模式
,因为他总是在类刚刚加载的时候即创建实例对象。还用一种单例的实现方式被称为懒汉模式
,实现如下:
public class Singleton {
//懒汉
private static Singleton singleton =null;
private Singleton(){
System.out.println("生成唯一的实例");
}
public synchronized static Singleton getSingleton(){
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
可以看到,与饿汉模式
不同的是,懒汉模式
在最初是的时候仅仅创建一个null
的空引用,当首次调用getSingleton
的时候,由于singleton
的引用为空,所以会创建一个新的实例对象。在后续调用的时候,都只返回这一个实例即可。