1、引言設計模式
我在博客園的我的博客是今年2月份申請的,可是到如今一片文章都沒有寫,都有點感受對不起這個博客(有點裝。。哈哈)。好,話很少說,這篇文章裏面給你們介紹23種設計模式中的第一種設計模式——單例模式。函數
2、單例模式
spa
說到單例模式,你們的第一反應應該是——什麼是單例模式。單例模式的定義,官方的定義總結起來就兩句話,確保一個類只有一個實例(也就是類的對象),而且提供一個全局的訪問點(外部經過這個訪問點來訪問該類的惟一實例)。 哈哈,是否是有點懵了,不要緊,正常! 單例模式的實現其實只有兩行代碼,定義裏面的這兩句話分別對應一句代碼。我在這裏不解釋這個定義,咱們用代碼來講話。我在這裏新建一個控制檯應用程序來給你們介紹單例模式。 看到這裏你們應該能明白,單例模式的實現代碼了吧。操作系統
namespace _01單例模式 { class Program { static void Main(string[] args) { //咱們在外部經過全局訪問點去訪問該類的惟一實例 Singleton s = Singleton.only; } } public class Singleton//單例類 { //2.提供一個全局訪問點(其實就是一個全局靜態字段),外部能夠經過該字段訪問該類的惟一實例 //由於靜態字段是屬於類的,因此這樣能夠保證只有一個實例。 public static Singleton only = new Singleton(); //1 將構造函數聲明成私有的,這樣能夠確保在類的外部沒法實例化該類(即在類的外部獲取不到類的實例) private Singleton() { } } }
第一步:將類的構造函數生命爲私有的構造函數,這樣咱們在外部就沒法經過Singleton s = new Singleton()來實例化該,由於Private生命的成員只有在該類的內部能夠訪問。這樣能夠保證類的實例只有一個(那就是在類的內部給它實例化)。設計
第二步:在類的裏面聲明一個公開的全局的靜態字段(其實也就是提供一個全局的訪問點),外部對象經過這個訪問點能夠拿到該類的惟一實例。切記,該字段必須聲明成static靜態段,若是聲明成非靜態字段,那在類的外部就訪問不到了。由於非靜態成員只能經過類的實例去訪問,而咱們在類的外部是沒法對該類進行實例化的。code
接下來的就是第二個問題,單例模式的做用是什麼呢?其實定義單例模式的定義已經給了咱們答案,做用就是——使得類的一個對象成爲系統中的惟一實例。說了好像和沒說同樣吧,舉個例子你就知道他有什麼好處了。一個操做系統中能夠存在多個打印任務,但咱們只有一個打印機,同一時間只能有一個正在工做的任務,這個時候內存中打印機的這個類就必須是單例的,不然的話就能夠同時執行多個打印任務,這顯然會形成錯誤。對象