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