设计模式-单例模式

几种单例模式的实现

Posted by LQFGH on August 17, 2019

单例模式集中实现方式

饿汉式:直接创建对象,不存在线程安全问题

  • 直接实例化饿汉式
  • 枚举式
  • 静态代码块饿汉式(包含复杂实例化代码)

懒汉式:延迟创建对象

  • 线程不安全
  • 线程安全
  • 双检模式
  • 静态内部类

饿汉式

直接实例化饿汉式

1
2
3
4
5
6
7
8
9
10
public class Singleton1 {

    private final static Singleton1 INSTANT = new Singleton1();

    private Singleton1(){}

    public static Singleton1 getInstance(){
        return INSTANT;
    }
}

枚举式

1
2
3
public enum  Singleton2 {
    INSTANT
}

静态代码块饿汉式(包含复杂实例化代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Singleton3 {

    private static Singleton3 INSTANCE ;

    private Singleton3(){}

    static {
        INSTANCE = new Singleton3();
        // 这里可以写一些创建的逻辑
    }
    
    public static Singleton3 getInstance(){
        return INSTANCE;
    }
}

懒汉式

线程不安全

1
2
3
4
5
6
7
8
9
10
11
12
13
public class SingleTon4 {

    private static SingleTon4 INSTANCE;

    private SingleTon4(){}

    public static SingleTon4 getInstance(){
        if (INSTANCE == null) {
            INSTANCE = new SingleTon4();
        }
        return INSTANCE;
    }
}

线程安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SingleTon5 {

    private static SingleTon5 INSTANCE;

    private SingleTon5(){}

    public static SingleTon5 getInstance(){
        synchronized (SingleTon5.class){
            if (INSTANCE == null) {
                INSTANCE = new SingleTon5();
            }
        }
        return INSTANCE;
    }
}

双检模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SingleTon5 {

    private static SingleTon5 INSTANCE;

    private SingleTon5(){}

    public static SingleTon5 getInstance(){
        if (INSTANCE == null) {
            synchronized (SingleTon5.class){
                if (INSTANCE == null) {
                    INSTANCE = new SingleTon5();
                }
            }
        }
        return INSTANCE;
    }
}

静态内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton6 {

    private Singleton6(){}

    private static class Inner{
        private final static Singleton6 INSTANCE = new Singleton6();
    }

    public static Singleton6 getInstent(){
        return Inner.INSTANCE;
    }

}