核心作用:保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。
餓漢式:
/**
* 單利模式:餓漢式載入
* 餓漢單例模式**中,static變數會在類裝載時初始化,此時也不會涉及多個執行緒物件訪問物件的問題。虛擬機器保證只會裝載一次該類,肯定不會發生併發訪問的問題。
* 因此,可以省略synchronized關鍵字
* 問題:如果只是載入本類,而不是要呼叫getinstance(),甚至永遠沒有呼叫,則會造成資源浪費。
* @author zw**/
public class hungryload
//方法沒有同步,呼叫效率高。
public static hungryload getinstance()
}
懶漢式
/**
* 單例模式:懶漢式載入
* 延遲載入,懶載入!真正用的時候才載入。
* 問題:資源利用率高了。但是每次呼叫getinstance()方法都要同步,併發效率較低。
* @author zw
* */
public class lazyload
}//方法同步,呼叫效率低。
public static synchronized lazyload getinstance()
return instance;
}}
靜態內部類
/**
* 單例模式:靜態內部類(也是一種懶載入)
* 外部類沒有static屬性,則不會像餓漢式那樣立即載入物件。
* 只有真正呼叫getinstance(),才會載入靜態內部類,載入類時是執行緒安全的。instance是static final 型別,保證了記憶體中只有這樣乙個例項存在,
* 而且只能被賦值一次,從而保證了執行緒安全性。
* 兼備了併發高效呼叫和延遲載入的優勢!
* @author zw
* */
public class staticinnerclassload
private staticinnerclassload()
public static staticinnerclassload getinstance()
}
列舉
/**
* 單例模式:列舉載入
* 實現簡單
* 列舉本身就是單例模式,由jvm從根本上提供保障!避免通過反射和反序列化的漏洞!
* 問題:無延遲載入。
* @author zw
* */
public enum enumload
}
開發時,如果類建立物件的代價很高,就用延時載入(懶漢式);類呼叫效率非常頻繁,用餓漢式
單例物件:占用 資源少;不需要延時載入。
列舉式 好於 餓漢式
單例物件:占用 資源大;需要延時載入。
靜態內部類式 好於 懶漢式
防止通過反射建立多個物件,在構造方法中加
if (instance != null)
單例模式應用的場景一般發現在以下條件下:
(1)資源共享的情況下,避免由於資源操作時導致的效能或損耗等。如上述中的日誌檔案,應用配置。
(2)控制資源的情況下,方便資源之間的互相通訊。如執行緒池等。
GOF23之單例模式
單例模式是gof23中最簡單的模式。單例的設計模式裡的出場率很高,它簡單但也有多種實現方式,也正是因為它的靈活性和重要性使喚其多次出現在面試筆試中,經常與工廠模式搭配使用。作用 保證乙個類只能有乙個例項。多次建立只會返回同乙個例項。作用範圍 如word中的工具箱,任何時候只能有乙個工具箱。大話設計模...
GoF23 單例(Singleton)模式
目標之一 提高程式的可復用性 有哪些功能可以被擴充套件?擴充套件功能時必須修改哪些地方?有哪些類不需要修改?保證在jvm中只有乙個例項。需要該物件時,new例項物件。不安全 class singleton 當需要時才例項化,之後都是乙個例項。懶漢式不安全,所以需要加上同步。return public...
GOF23 單例模式(1)
核心作用 保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。常見的應用場景 1.windows的task manager 任務管理器 2.windows的recycle bin 站 3.專案中,讀取配置檔案的類,一般也只有乙個物件,沒有必要每次使用配置檔案資料,每次new乙個物件去讀取。...