單例模式的幾種實現(xiàn)方式:
一:餓漢式單例
方式一:枚舉方式獲得單例對象
方式二:靜態(tài)屬性獲得單例對象
方式三:靜態(tài)方法獲得單例對象
二:懶漢式單例
方式一:靜態(tài)方法獲得單例對象(線程安全)
方式二:內(nèi)部類方式去獲取單例對象
示例:
惡漢式:方式一
enum Singleton{
INSTANCE;//單例
}
惡漢式:方式二
class Singleton{
public static final Singleton INSTANCE = new Singleton();//單例
private Singleton(){}
}
惡漢式:方式三
class Singleton{
private static final Singleton INSTANCE = new Singleton();//單例
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
懶漢式:方式一
class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
//存在線程安全問題(多線程的時候,不一定是單例)
/*if(null == instance){
instance = new Singleton();
}
return instance;*/
if(null == instance){ //提升代碼效率,避免每一次都去走同步代碼塊
synchronized(Singleton.class){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}
return instance;
}
}
}
懶漢式:方式二
class Singleton{
private Singleton(){}
private static class Inner{
public static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return Inner.INSTANCE;
}
}