下面是正文
目的
将类的责任集中到唯一的单体对象中,确保该类只有一个实例,并且为该类提供一个全局访问点。
难点
在于系统中任何识别单体和保证单体的唯一性。
实现
- 提供唯一的私有构造器
- 使用静态域来维护实例
- 使用静态方法监视实例的创建
- 单体对象的成员变量
主要作用
保证在Java程序中,一个class只有一个实例存在
表现形式
- 饿汉式(类初始化时,会立即加载此对象。线程安全)
public class HungrySingleton{
//使用静态域维护实例
private static final HungrySingleton hungrySingletonInstance = new HungrySingleton();
//唯一的私有构造器
private HungrySingleton(){}
//使用静态方法监视实例的创建
public static HungrySingleton getInstance(){
return hungrySingletonInstance;
}
}
- 懒汉式(在使用时加载此对象,延时加载的效果。线程不安全)
方式一:只能在单线程中使用,线程不安全
public class LazySingleton{
//使用静态域维护实例
private static final LazySingleton lazySingletonInstance = null;
//唯一的私有构造器
private LazySingleton(){}
//使用静态方法监视实例的创建
public static LazySingleton getInstance(){
if (null == lazySingletonInstance){
lazySingletonInstance = new LazySingleton();
}
return lazySingletonInstance;
}
}
方式二:在多线程中使用,线程安全,但是效率比较低
public class LazySingleton{
//使用静态域维护实例
private static LazySingleton lazySingletonInstance = null;
//唯一的私有构造器
private LazySingleton(){}
//使用静态方法监视实例的创建
public static synchronized LazySingleton getInstance(){
if (null == lazySingletonInstance){
lazySingletonInstance = new LazySingleton();
}
return lazySingletonInstance;
}
}
- 双重检查锁定单例
public class DoubleCheckLockSingleton{
//使用静态域维护实例
private volatile static DoubleCheckLockSingleton doubleCheckLockSingletonInstance = null;
//唯一的私有构造器
private DoubleCheckLockSingleton(){}
//使用静态方法监视实例的创建
public static synchronized DoubleCheckLockSingleton getInstance(){
if (null == doubleCheckLockSingletonInstance){ // 第一次检查
synchronized(DoubleCheckLockSingleton.class){
if (null = doubleCheckLockSingletonInstance){ //第二次检查
doubleCheckLockSingletonInstance = new DoubleCheckLockSingleton();
}
}
}
return doubleCheckLockSingletonInstance;
}
}
- 静态内部类(推荐)
public class StaticInnerClassSingleton{
private StaticInnerClassSingleton(){}
private static class StaticInnerClass{
private final static StaticInnerClassSingleton staticInnerClassSingletonInstance = new StaticInnerClassSingleton()
}
public static StaticInnerClassSingleton getInstance(){
return StaticInnerClass.StaticInnerClassSingletonInstance;
}
}
运行截图
相关模式
- 多例模式
- 抽象工厂模式:将具体工厂类设计为单例
- 建造模式:将具体类设计成单例