设计模式之单例模式

前言

单例模式(Singleton Pattern),顾名思义,是指确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式下类的构造函数要是私有的private,防止外部直接new实例化对象。

示例代码

下面介绍几种常见单例模式的写法:

//方式1:饿汉式单例,没有延迟初始化的效果(不推荐)
public class Singleton {
//利用类加载单线程初始化机制
private static final Singleton instance = new Singleton();
private Singleton{}
public static Singleton getInstance() {
return instance;
}
}

//方式2:懒汉式单例,锁的控制粒度为方法级别,太粗(不推荐)
public class Singleton {
private static Singleton instance = null;
private Singleton{}
//锁粒度太粗
public synchronized static Singleton getInstance() {
if(instance == null){
instance = new Singleton();
}
return instance;
}
}

//方式3:双向检测单例模式(推荐)
public class Singleton {
//volatile关键字修饰,防止指令重排
private static volatile Singleton instance = null;
private Singleton{}
public static Singleton getInstance() {
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}

//方式4:利用内部类的延迟初始化机制(推荐)
public class Singleton {
private Singleton{}
public static Singleton getInstance() {
return SingletonInstance.instance;
}
//内部类的延迟初始化(类加载器是单线程操作)
private static class SingletonInstance {
public static final Singleton instance = new Singleton();
}
}

如何打破单例模式

方式1:利用反射,设置私有的构造函数为可访问的
方式2:利用序列化与反序列化
方式3:利用clone机制