JavaSE面試題---單例模式七種寫法

定義

保證一個類僅有一個實例,並提供一個訪問它的全局訪問點

七種寫法

1.餓漢式(簡潔直觀)

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

2.枚舉(餓漢式的變種,最簡潔)

public enum  Singleton {
    INSTANCE;
}

枚舉類型默認構造是私有的

3.靜態代碼快(餓漢式的變種,適合複雜的實例化(如外部資源導入等))

public class Singleton {
    private static final Singleton INSTANCE;
    
    private Singleton(){
    }

    static {
       INSTANCE = new Singleton();
    }
    
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

4.懶漢式(線程不安全,適用於單線程)

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {
    }

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

5.雙重檢測鎖(DCL,懶漢式的改進,實現線程安全(同步),適用於多線程)

public class Singleton {  
	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;  
	}  
}  

6.靜態內部類(懶漢式的改進,適用於多線程)

public class Singleton {
    private Singleton() {
    }

    private static class InnerClass {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return InnerClass.INSTANCE;
    }
}

7.容器(懶漢式的一種,適用於多線程)

public class Singleton {
    private static Map<String,Object> map=new HashMap<String, Object>();
    
    private Singleton(){
    }
    
    public static void registerService(String key,Object instance){
        if (!map.containsKey(key)){
            map.put(key,instance);
        }
    }
    
    public static Object getService(String key){
        return map.get(key);
    } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章