1. 程式人生 > 其它 >單例模式的五種寫法

單例模式的五種寫法

技術標籤:設計模式

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。

單例的實現主要是通過以下兩個步驟

  1. 將該類的構造方法定義為私有方法,這樣其他處的程式碼就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項;
  2. 在該類內提供一個靜態方法,當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用。

單例模式的五種實現方式

1.餓漢單例​​​​​​​


/**
 * @author: sfg
 * @create: 2020-12-23 19:40
 **/
public class HungrySingleton {
    private static HungrySingleton hungrySingleton = new HungrySingleton();
    private HungrySingleton(){}
    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }

}

​​​​​ 2.懶漢單例


/**
 * @author: sfg
 * @create: 2020-12-22 20:40
 **/
public class LazySingleton {
    private LazySingleton(){}
    private static  LazySingleton LAZY_SINGLETON = null;

    public synchronized static LazySingleton getLazySingleton(){
        if (LAZY_SINGLETON == null){
            LAZY_SINGLETON = new LazySingleton();
        }
        return LAZY_SINGLETON;
    }
}

3.雙重檢索

/**
 * @author: sfg
 * @create: 2020-12-23 20:46
 **/
public class DoubleCheckSingleton {
    private DoubleCheckSingleton(){}

    private static DoubleCheckSingleton doubleCheckSingleton;

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

}

4.靜態內部類單例模式


/**
 * @author: sfg
 * @create: 2020-12-22 21:03
 **/
public class LazyInnerSingleton {
    private LazyInnerSingleton() {

    }

    public static final LazyInnerSingleton getInstance() {
        return LazyInner.LAZY_INNER_SINGLETON;
    }

    private static final class LazyInner {
        private static final LazyInnerSingleton LAZY_INNER_SINGLETON = new LazyInnerSingleton();
    }

}

5.列舉單例模式

/**
 * @author: sfg
 * @create: 2020-12-23 20:50
 **/
public enum EnumSingleton {
    INSTANCE;

    //可以省略此方法,EnumSingleton.INSTANCE進行操作
    public static EnumSingleton getInstance() {
        return EnumSingleton.INSTANCE;
    }
}