單例模式的意思就是只有一個實例
單例模式確保某一個類只有一個實例
而且自行實例化並向整個系統提供這個實例
這個類稱為單例類
每台計算機可以有若干個打印機
但只能有一個Printer Spooler
以避免兩個打印作業同時輸出到打印機中
每台計算機可以有若干傳真卡
但是只應該有一個軟件負責管理傳真卡
以避免出現兩份傳真作業同時傳到傳真卡中的情 況
每台計算機可以有若干通信端口
系統應當集中管理這些通信端口
以避免一個通信端口同時被兩個請求同時調用
問題描述
單例模式 Singleton Pattern
問題解決
()單例模式簡介
Singleton模式要求一個類有且僅有一個實例並且提供了一個全局的訪問點這就提出了一個問題如何繞過常規的構造器提供一種機制來保證 一個類只有一個實例?客戶程序在調用某一個類時它是不會考慮這個類是否只能有一個實例等問題的所以這應該是類設計者的責任而不是類使用者的責任
單例模式特點
()一個類有且僅有一個實例
()類提供一個全局的訪問點
()單例模式的實現
()簡單實現
上述實現的優點
()直到對象要求時才進行實例的初始化這種實現方法稱為“惰性實例化”惰性實例化避免了程序啟動時創建不必要的Singleton
上述實現的缺點
()這種實現對於多線程環境並不安全可能實例化多個對象例如可能存在兩個線程進行instance==null的判斷然後創建兩個單例對象這就違背了單例模式的設計意圖
()安全的線程
以上的實現保證了單例對象在多線程的情況下只會創建一個但是padlock增加了額外的開銷
()雙重鎖定
這種實現方式對多線程來說是安全的同時線程不是每次都加鎖只有判斷對象實例沒有被創建時它才加鎖有了我們上面第一部分的裡面的分析我們知道加鎖 後還得再進行對象是否已被創建的判斷它解決了線程並發問題同時避免在獲取 Instance 的調用中都出現獨占鎖定它還允許您將實例化延遲到第一次訪問對象時發生實際上應用程序很少需要這種類型的實現大多數情況下我們會用靜態初始化這 種方式仍然有很多缺點無法實現延遲初始化
()靜態初始化
此實現中將在第一次引用類的任何成員創建實例該類標記為 sealed 以阻止發生派生而派生可能會增加實例此外變量標記為 readonly這意味著只能在靜態初始化期間(此處顯示的示例)或在類構造函數中分配變量它仍然可以用來解決 Singleton 模式試圖解決的兩個基本問題全局訪問和實例化控制公共靜態屬性為訪問實例提供了一個全局訪問點此外由於構造函數是私有的因此不能在類本身以外實 例化 Singleton 類因此變量引用的是可以在系統中存在的唯一的實例
由於 Singleton 實例被私有靜態成員變量引用因此在類首次被對 Instance 屬性的調用所引用之前不會發生實例化這種方法唯一的潛在缺點是您對實例化機制的控制權較少在 Design Patterns 形式中您能夠在實例化之前使用非默認的構造函數或執行其他任務由於在此解決方案中由 NET Framework 負責執行初始化因此您沒有這些選項在大多數情況下靜態初始化是在 NET 中實現 Singleton 的首選方法
()延遲初始化
()單例模式的優缺點
()單例模式適用情況和應用場景
()具體實例
總結
Singleton設計模式是一個非常有用的機制可用於在面向對象的應用程序中提供單個訪問點
From:http://tw.wingwit.com/Article/program/net/201311/14059.html