程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 深入淺出單例模式

深入淺出單例模式

編輯:C#入門知識

     從現在看來,學習設計模式是很久之前的事了,剛開始的時候對設計模式的理解真的很淺,基本就是處於表面,不知道怎麼在系統中應用。現在小組開始合作做系統了,在系統中使用設計模式,能更好的實現代碼復用,讓自己的系統更好的做到低耦合高內內,同時對於後期的擴展和維護也更加的方便。         這篇博客我們主要重新回顧和認識單例模式: 單例模式(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、向整個系統公開實例接口,對唯一實例的受控訪問。        所有的設計模式都是一樣的,既有優點也有缺點,我們利用它的優點的同時,不能忽略他的缺點,在多線程的程序中,多個線程同時訪問,會造成創建多個實例,存在不安全問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved