1. 程式人生 > >Effective Java 第二版 中文版 筆記(三)列舉實現單例模式

Effective Java 第二版 中文版 筆記(三)列舉實現單例模式

 列舉實現單例模式:

public enum DataSourceEnum {
    DATASOURCE;
    private DBConnection connection = null;
    private DataSourceEnum() {
        connection = new DBConnection();
    }
    public DBConnection getConnection() {
        return connection;
    }
}  

(二)經典單例模式

1、餓漢式單例(立即載入方式)

餓漢式單例在類載入初始化時就建立好一個靜態的物件供外部使用,除非系統重啟,這個物件不會改變,所以本身就是執行緒安全的。

// 餓漢式單例
public class Singleton {
    // 私有構造
    private Singleton() {}

    private static Singleton single = new Singleton();

    // 靜態工廠方法
    public static Singleton getInstance() {
        return single;
    }
}

2、懶漢式單例(延遲載入方式)

       該示例雖然用延遲載入方式實現了懶漢式單例,但在多執行緒環境下會產生多個single物件

// 懶漢式單例
public class Singleton {

    // 私有構造
    private Singleton() {}

    private static Singleton single = null;

    public static Singleton getInstance() {
        if(single == null){
            single = new Singleton();
        }
        return single;
    }
}

新增同步鎖

public class Singleton {
    // 私有構造
    private Singleton() {}

    private static Singleton single = null;

    public static Singleton getInstance() {
        
        // 等同於 synchronized public static Singleton getInstance()
        synchronized(Singleton.class){
          // 注意:裡面的判斷是一定要加的,否則出現執行緒安全問題
            if(single == null){
                single = new Singleton();
            }
        }
        return single;
    }
}

該方式執行效率卻很低。

public class SingletonFactory {
    
    // 內部列舉類
    private enum EnmuSingleton{
        Singleton;
        private Singleton singleton;
        
        //列舉類的構造方法在類載入是被例項化 
        private EnmuSingleton(){
            singleton = new Singleton();
        }
        public Singleton getInstance(){
            return singleton;
        }
    }
    public static Singleton getInstance() {
        return EnmuSingleton.Singleton.getInstance();
    }
}

class Singleton{
    public Singleton(){}
}