定义
保证一个类只有一个实例,并提供一个访问它的全局访问点。
把创建实例的权限收回,让类自身负责类实例的创建工作,然后由这个类来提供外部可以访问这个类实例的方法。
本质
控制实例数量
登场角色
-
Singleton
负责创建Singleton类自己的唯一的实例,并提供一个getSingleton方法来让外部访问这个唯一实例。
单例模式的实现方式
饿汉式
/**
* 饿汉式
* 应用在创建和使用实例开销不大的场景
*/
public class Singleton1 {
private Singleton1(){}
public static Singleton1 singleton1 = new Singleton1();
public static Singleton1 getInstance(){
return singleton1;
}
}
懒汉式
/**
* 懒汉式
* 创建开销较大,所以延迟实例化,在用到时才会去创建实例
*/
public class Singleton2 {
private Singleton2(){}
private static Singleton2 singleton2;
//双重检查模式,弊端在于由于JVM的指令重排序,使得调用时可能会返回空对象
public static Singleton2 getInstance(){
if(singleton2 == null){
synchronized (Singleton2.class){
if(singleton2 == null){
singleton2 = new Singleton2();
}
}
}
return singleton2;
}
}
静态内部类
/**
* 静态内部类的实现方式
*/
public class Singleton3 {
private Singleton3(){}
private static class Singleton3Handler{
private static Singleton3 singleton3 = new Singleton3();
}
public static Singleton3 getInstance(){
return Singleton3Handler.singleton3;
}
}
枚举
/**
* 枚举
*/
public enum Singleton4 {
SINGLETON_4;
public static Singleton4 getInstance(){
return SINGLETON_4;
}
}
功能
用来保证一个类在运行期间只有一个实例,并提供了一个全局的访问点。只关心类的创建问题。
何时使用
当需要控制一个类的实例只有一个时。