一、引言
我在博客園的個人博客是今年2月份申請的,但是到現在一片文章都沒有寫,都有點感覺對不起這個博客(有點裝。。哈哈)。好,話不多說,這篇文章裡面給大家介紹23種設計模式中的第一種設計模式——單例模式。
二、單例模式
說到單例模式,大家的第一反應應該是——什麼是單例模式。單例模式的定義,官方的定義總結起來就兩句話,確保一個類只有一個實例(也就是類的對象),並且提供一個全局的訪問點(外部通過這個訪問點來訪問該類的唯一實例)。 哈哈,是不是有點懵了,沒關系,正常! 單例模式的實現其實只有兩行代碼,定義裡面的這兩句話分別對應一句代碼。我在這裡不解釋這個定義,我們用代碼來說話。我在這裡新建一個控制台應用程序來給大家介紹單例模式。
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() { } } } View Code看到這裡大家應該能明白,單例模式的實現代碼了吧。
第一步:將類的構造函數生命為私有的構造函數,這樣我們在外部就無法通過Singleton s = new Singleton()來實例化該,因為Private生命的成員只有在該類的內部可以訪問。這樣可以保證類的實例只有一個(那就是在類的內部給它實例化)。
第二步:在類的裡面聲明一個公開的全局的靜態字段(其實也就是提供一個全局的訪問點),外部對象通過這個訪問點可以拿到該類的唯一實例。切記,該字段必須聲明成static靜態段,如果聲明成非靜態字段,那在類的外部就訪問不到了。因為非靜態成員只能通過類的實例去訪問,而我們在類的外部是無法對該類進行實例化的。
接下來的就是第二個問題,單例模式的作用是什麼呢?其實定義單例模式的定義已經給了我們答案,作用就是——使得類的一個對象成為系統中的唯一實例。說了好像和沒說一樣吧,舉個例子你就知道他有什麼好處了。一個操作系統中可以存在多個打印任務,但我們只有一個打印機,同一時間只能有一個正在工作的任務,這個時候內存中打印機的這個類就必須是單例的,否則的話就可以同時執行多個打印任務,這顯然會造成錯誤。