定義與特點
單例(singleton)模式的定義:指一個類隻有一個執行個體,且該類能自行建立這個執行個體的一種模式。
例如,windows 中隻能打開一個任務管理器,這樣可以避免因打開多個任務管理器視窗而造成記憶體資源的浪費,或出現各個視窗顯示内容的不一緻等錯誤。
單例模式有 3 個特點:
單例類隻有一個執行個體對象;
該單例對象必須由單例類自行建立;
單例類對外提供一個通路該單例的全局通路點;
結構與實作
單例模式是設計模式中最簡單的模式之一。通常,普通類的構造函數是公有的,外部類可以通過“new 構造函數()”來生成多個執行個體。但是,如果将類的構造函數設為私有的,外部類就無法調用該構造函數,也就無法生成多個執行個體。這時該類自身必須定義一個靜态私有執行個體,并向外提供一個靜态的公有函數用于建立或擷取該靜态私有執行個體。
單例模式的主要角色如下:
單例類(singleton):包含一個執行個體且能自行建立這個執行個體的類。
通路類(client):使用單例的類。
singleton 模式通常有兩種實作形式:懶漢式單例、餓漢式單例。
該模式的特點是類加載時沒有生成單例,隻有當第一次調用 getlnstance 方法時才去建立這個單例。代碼如下:
該模式的特點是類一旦加載就建立一個單例,保證在調用 getinstance 方法之前單例已經存在了。代碼如下:
應用場景
前面分析了單例模式的結構與特點,以下是它通常适用的場景的特點:
在應用場景中,某類隻要求生成一個對象的時候,如一個班中的班長、每個人的身份證号等。
當對象需要被共享的場合。由于單例模式隻允許建立一個對象,共享該對象可以節省記憶體,并加快對象通路速度。如 web 中的配置對象、資料庫的連接配接池等。
當某類需要頻繁執行個體化,而建立的對象又頻繁被銷毀的時候,如多線程的線程池、網絡連接配接池等。
擴充:多例模式
單例模式可擴充為多例(multition)模式,這種模式可生成多個執行個體并儲存在 list 中,客戶需要時可随機擷取,其結構圖如圖所示:
多例模式可分為以下兩種:
有上限多例模式:多例類的執行個體數目有上限,并把執行個體的上限當做邏輯的一部分創造到了多例類的内部,這種多例模式叫做有上限多例模式。
無上限多例模式:多例類的執行個體數目并不需要有上限,執行個體數目并沒有上限的多例模式就叫做無上限多例模式。