設計模式詳解(1)——單例模式
在有些系統中,為了節省記憶體資源、保證資料內容的一致性,對某些類要求只能建立乙個例項,這就是所謂的單例模式。
單例(singleton)模式的定義:指乙個類只有乙個例項,且該類能自行建立這個例項的一種模式。例如,windows 中只能開啟乙個任務管理器,這樣可以避免因開啟多個任務管理器視窗而造成記憶體資源的浪費,或出現各個視窗顯示內容的不一致等錯誤。
在計算機系統中,還有 windows 的**站、作業系統中的檔案系統、多執行緒中的執行緒池、顯示卡的驅動程式物件、印表機的後台處理服務、應用程式的日誌物件、資料庫的連線池、**的計數器、web 應用的配置物件、應用程式中的對話方塊、系統中的快取等常常被設計成單例。
單例模式有 3 個特點:
單例類只有乙個例項物件;
該單例物件必須由單例類自行建立;
單例類對外提供乙個訪問該單例的全域性訪問點;
單例模式是設計模式中最簡單的模式之一。通常,普通類的建構函式是公有的,外部類可以通過「new 建構函式()」來生成多個例項。但是,如果將類的建構函式設為私有的,外部類就無法呼叫該建構函式,也就無法生成多個例項。這時該類自身必須定義乙個靜態私有例項,並向外提供乙個靜態的公有函式用於建立或獲取該靜態私有例項。
下面來分析其基本結構和實現方法。
單例模式的主要角色如下。
單例類:包含乙個例項且能自行建立這個例項的類。
訪問類:使用單例的類。
其結構如下圖所示。
singleton 模式通常有兩種實現形式。
第 1 種:懶漢式單例
該模式的特點是類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例。**如下:
public
class
lazysingleton
//private 避免類在外部被例項化
public
static
synchronized lazysingleton getinstance()
return instance;
}}
第 2 種:餓漢式單例
該模式的特點是類一旦載入就建立乙個單例,保證在呼叫 getinstance 方法之前單例已經存在了。
public
class
hungrysingleton
public
static hungrysingleton getinstance()
}
餓漢式單例在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,所以是執行緒安全的,可以直接用於多執行緒而不會出現問題。
【例1】用懶漢式單例模式模擬產生美國當今**物件。
分析:在每一屆任期內,美國的**只有一人,所以本例項適合用單例模式實現,下圖 所示是用懶漢式單例實現的結構圖。
程式**如下
public
class
singletonlazy
else}}
class
president
public
static
synchronized president getinstance()
else
return instance;
}public
void
getname()
}
程式執行結果如下:
產生乙個**!
我是美國**:川普。
已經有乙個**,不能產生新**!
我是美國**:川普。
他們是同一人!
【例2】用餓漢式單例模式模擬產生美國當今**物件。
public
class
singletonhungry
else}}
class
president
public
static
synchronized president getinstance()
public
void
getname()
}
程式執行結果如下:
產生乙個**!
我是美國**:川普。
我是美國**:川普。
他們是同一人!
通過例子能夠看出
餓漢就是類一旦載入,就把單例初始化完成,保證getinstance的時候,單例是已經存在的了,而懶漢比較懶,只有當呼叫getinstance的時候,才回去初始化這個單例。
另外從以下兩點再區分以下這兩種方式:
1、執行緒安全:
餓漢式天生就是執行緒安全的,可以直接用於多執行緒而不會出現問題。
如果沒有volatile關鍵字,懶漢式本身是非執行緒安全的,為了實現執行緒安全可通過在getinstance方法呼叫時加上同步。但會對效能造成一定影響。
2、資源載入和效能:
餓漢式在類建立的同時就例項化乙個靜態物件出來,不管之後會不會使用這個單例,都會佔據一定的記憶體,但是相應的,在第一次呼叫時速度也會更快,因為其資源已經初始化完成。
而懶漢式顧名思義,會延遲載入,在第一次使用該單例的時候才會例項化物件出來,第一次呼叫時要做初始化,如果要做的工作比較多,效能上會有些延遲,之後就和餓漢式一樣了。
前面分析了單例模式的結構與特點,以下是它通常適用的場景的特點。
在應用場景中,某類只要求生成乙個物件的時候,如乙個班中的班長、每個人的身份證號等。
當物件需要被共享的場合。由於單例模式只允許建立乙個物件,共享該物件可以節省記憶體,並加快物件訪問速度。如 web 中的配置物件、資料庫的連線池等。
當某類需要頻繁例項化,而建立的物件又頻繁被銷毀的時候,如多執行緒的執行緒池、網路連線池等。
單例模式可擴充套件為有限的多例(multitcm)模式,這種模式可生成有限個例項並儲存在 armylist 中,客戶需要時可隨機獲取,其結構圖如下圖所示。
設計模式 單例模式詳解
1.懶漢式,執行緒不安全 public class singletonpattern 懶漢式,執行緒不安全 private static singletonpattern instance public static singletonpattern getinstance return insta...
設計模式 單例模式詳解
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的辦法就是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立,並且它可以提供乙個訪問該例項的方法。我們知道,o...
設計模式1 單例模式
文章引用出處 singleton模式是最簡單最常用的設計模式。1,定義 確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個該類。2,單例模式優點 1 單例模式在記憶體中只有乙個例項,減少了記憶體的開支。2 單例模式只生成乙個例項模式,減少了系統效能的開銷。如當乙個物件的產生需要比較多的系統資...