单列设计模式分两种:
- 饿汉式:类加载就会导致该单实例对象被创建
- 懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建
1 饿汉式(静态变量)
class Singleton01 {
//1.本类内部创建对象实例
private final static Singleton01 instance = new Singleton01();
//2.构造方法私有化,外部不能new
private Singleton01() {}
//3.提供公共的静态方法,返回实例对象
public static Singleton01 getInstance() {
return instance;
}
}
2 饿汉式(静态代码块)
class Singleton02 {
private static Singleton02 instance;
private Singleton02() {
}
static {
instance = new Singleton02();
}
public static Singleton02 getInstance() {
return instance;
}
}
3 懒汉式(线程不安全)
class Singleton03 {
private static Singleton03 instance;
private Singleton03() {
}
//提供一个静态公有方法,当使用到该方法时,采取创建instance,即懒汉式
public static Singleton03 getInstance() {
//一个线程进入if,还未来得及向下执行,另一个线程也进入了if,便会产生多个实例
if (instance == null) {
instance = new Singleton03();
}
return instance;
}
}
4 懒汉式(线程安全)
class Singleton04 {
private static Singleton04 instance;
private Singleton04() {
}
public static synchronized Singleton04 getInstance() {
if (instance == null) {
instance = new Singleton04();
}
return instance;
}
}
5 懒汉式(双重检查锁)
class Singleton05 {
private static volatile Singleton05 singleton;
private Singleton05() {
}
public static Singleton05 getInstance() {
if (singleton == null) {
synchronized (Singleton05.class) {
if (singleton == null){
singleton = new Singleton05();
}
}
}
return singleton;
}
}
6 静态内部类
class Singleton06 {
private static volatile Singleton06 instance;
private Singleton06() {
}
//写一个静态内部类,直接返回SingletonInstance.INSTANCE
public static class SingletonInstance{
private static final Singleton06 INSTANCE = new Singleton06();
}
public static Singleton06 getInstance() {
return SingletonInstance.INSTANCE;
}
}
7 枚举
enum Singleton08{
//属性
INSTANCE;
public void sayOK(){
System.out.println("ok~");
}
}
8 单例模式在JDK应用
参考资料:
黑马设计模式