設計模式 單例模式

2021-09-20 07:33:29 字數 2409 閱讀 9237

單例(singleton)模式的定義:指乙個類只有乙個例項,且該類能自行建立這個例項的一種模式。例如,windows 中只能開啟乙個任務管理器,這樣可以避免因開啟多個任務管理器視窗而造成記憶體資源的浪費,或出現各個視窗顯示內容的不一致等錯誤。

在計算機系統中,還有 windows 的**站、作業系統中的檔案系統、多執行緒中的執行緒池、顯示卡的驅動程式物件、印表機的後台處理服務、應用程式的日誌物件、資料庫的連線池、**的計數器、web 應用的配置物件、應用程式中的對話方塊、系統中的快取等常常被設計成單例。

單例模式有 3 個特點:

單例類只有乙個例項物件;

該單例物件必須由單例類自行建立;

單例類對外提供乙個訪問該單例的全域性訪問點;

單例模式是設計模式中最簡單的模式之一。通常,普通類的建構函式是公有的,外部類可以通過「new 建構函式()」來生成多個例項。但是,如果將類的建構函式設為私有的,外部類就無法呼叫該建構函式,也就無法生成多個例項。這時該類自身必須定義乙個靜態私有例項,並向外提供乙個靜態的公有函式用於建立或獲取該靜態私有例項。

下面來分析其基本結構和實現方法。

單例模式的主要角色如下。

其結構如圖 1 所示。

圖1 單例模式的結構圖

singleton 模式通常有兩種實現形式。

第 1 種:懶漢式單例

該模式的特點是類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例。**如下:

public class lazysingleton

//private 避免類在外部被例項化

public staticlazysingleton getinstance()}}

return instance;}}

第 2 種:餓漢式單例

該模式的特點是類一旦載入就建立乙個單例,保證在呼叫 getinstance 方法之前單例已經存在了。

public class hungrysingleton

public static hungrysingleton getinstance()

}

餓漢式單例在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,所以是執行緒安全的,可以直接用於多執行緒而不會出現問題。

【例1】用懶漢式單例模式模擬產生美國當今**物件。

分析:在每一屆任期內,美國的**只有一人,所以本例項適合用單例模式實現,圖 2 所示是用懶漢式單例實現的結構圖。

圖2 美國**生成器的結構圖

程式**如下:

public class singletonlazy

else

}}class president

public static president getinstance()}}

else

return instance;

}public void getname()

}

程式執行結果如下:

產生乙個**!

我是美國**:川普。

已經有乙個**,不能產生新**!

我是美國**:川普。

他們是同一人!

圖3 豬八戒生成器的結構圖

程式**如下:

public class singletonlazy

else

}}class president

public static synchronized president getinstance()

else

return instance;

}public void getname()

}

程式執行結果如圖 4 所示。

圖4 豬八戒生成器的執行結果

前面分析了單例模式的結構與特點,以下是它通常適用的場景的特點。

單例模式可擴充套件為有限的多例(multitcm)模式,這種模式可生成有限個例項並儲存在 armylist 中,客戶需要時可隨機獲取,其結構圖如圖 5 所示。

圖5 有限的多例模式的結構圖

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...