确保某各类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类。
单例模式的要点:
1、某各类只能有一个实例。
2、它必须自行创建这个类的实例。
3、它必须向整个系统提供这个实例。
比如每台计算机可以有若干个传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同事传到传真卡中的情况。
单例模式的先实现方式
1、饿汉式单例
public class EagerSingleton {
private static final EagerSingleton eSingleton = new EagerSingleton();
//私有默认构造方法
private EagerSingleton(){}
//公有方法,让外界获取实例
public static EagerSingleton getInstance(){
return eSingleton;
}
}
在饿汉模式中,在类被加载时,静态变量eSingleton就会被初始化了,此时类的私有构造方法会被调用,这个时候,单例类的唯一实例就被创造出来了。由于构造函数是私有的,因此此类不能被继承.
懒汉式单例模式
与饿汉模式单例类相同之处是,类的构造函数是私有的,与饿汉不同的是,懒汉单例在第一次被引用时将自己实例化,如果加载器时静态的,那么懒汉单例类被加载时不会将自己实例化。
public class LazySingleton {
private static LazySingleton lazySingleton = null;
//默认私有构造方法,保证外界无法直接实例化
private LazySingleton() {
}
synchronized public static LazySingleton getInstance(){
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
可以看到,我们对静态方法使用了同步化,以处理多线程环境。网上有很多用法用了“双重检查”,也就是下面这个样子。但是这种方法并不推荐,可能会失效,具体原因读者可以网上看看~
public class Singleton4 {
// 私有构造
private Singleton4() {}
private static Singleton4 single = null;
// 双重检查
public static Singleton4 getInstance() {
if (single == null) {
synchronized (Singleton4.class) {
if (single == null) {
single = new Singleton4();
}
}
}
return single;
}
}