從現在看來,學習設計模式是很久之前的事了,剛開始的時候對設計模式的理解真的很淺,基本就是處於表面,不知道怎麼在系統中應用。現在小組開始合作做系統了,在系統中使用設計模式,能更好的實現代碼復用,讓自己的系統更好的做到低耦合高內內,同時對於後期的擴展和維護也更加的方便。 這篇博客我們主要重新回顧和認識單例模式: 單例模式(Singleton): 保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。 結構圖: C#語言的實現代碼: [csharp] <span style="font-family:Microsoft YaHei; font-size:18px">class Singleton { //定義一個私有變量,保存創建的實例 private static Singleton instance; //私有的構造方法,外界不能利用New創建此類實例 private Singleton () { } //提供一個靜態方法,用於返回唯一的Singleton實例 public static Singleton GetInstance() { //如果instance為null,表明還沒有創建Singleton對象 //如果instance不為null,則表明已經創建了Singleton對象,將不會執行該方法 if (instance == null) { //創建一個Singleton對象,並將緩存起來 instance = new Singleton(); } return instance; } }</span> [csharp] <span style="font-family:Microsoft YaHei; font-size:18px"> //客戶端代碼 static void Main(string[] args) { //創建Singleton對象不能通過構造器,只能通過getInstance方法 Singleton s1 = Singleton.GetInstance(); Singleton s2 = Singleton.GetInstance(); if (s1 == s2) //比較兩次實例化對象的結果是實例相同 { Console.WriteLine("兩個對象是相同的實例。"); } Console.Read(); }</span> 下面我們使用vb.net語言,實現單例模式。 首先建立一個Windows應用程序,默認的窗體為Form1,設置它的ISMdiContainer屬性為true,表示它是一個多文檔界面MdI子窗體的容器。然後建立button按鈕,我們再創建一個窗體ChildForm,單擊就創建一個子窗體。 在沒有使用單例模式的時候,子窗體會顯示多個(如圖1),但這並不是我們想要的結果,我們想要圖2中顯示的,無論單擊多少次,只顯示一個子窗體,此時我們就用到了單例模式。 圖1 圖2 下面我們按照我們上面的代碼照葫蘆畫瓢就好。 [csharp] Public Class ChildForm ' 定義一個私有變量,保存創建的實例 Private Shared instance As ChildForm '私有的構造方法,外界不能利用New創建此類實例(我們沒有寫),所有類都有構造方法,不編碼則系統默認生成空的構造方法 ' 提供一個靜態方法,用於返回唯一的Singleton實例 Public Shared Function CreateForm() As ChildForm '如果instance不存在或關閉時, 表明還沒有創建ChildForm對象 '如果instance存在時, 則表明已經創建了ChildForm對象, 將不會執行該方法 If instance Is Nothing OrElse instance.IsDisposed = True Then '創建一個ChildForm對象,並將緩存起來 instance = New ChildForm instance.MdiParent = Form.ActiveForm End If Return instance '返回實例化結果 End Function End Class '客戶端代碼 Public Class Form Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShow.Click '單擊顯示子窗體 ChildForm.CreateForm().Show() End Sub End Class 單例模式的優點和缺點: 優點: 1、保證該類只有唯一的實例。 2、該類自身負責保存實例,並保證沒有其他實例可以被創建。 3、向整個系統公開實例接口,對唯一實例的受控訪問。 所有的設計模式都是一樣的,既有優點也有缺點,我們利用它的優點的同時,不能忽略他的缺點,在多線程的程序中,多個線程同時訪問,會造成創建多個實例,存在不安全問題。