說說我學習單例模式的原因 :
在做MDI WinForm程序的時候,需要每個子窗體只能打開一次(同時只能有一個子窗體實例),之前網上看到好多種解決方案,各種嘗試都解決不了我遇到的問題,相信很多人跟我一樣,現在可以告訴大家,單利模式可以完美解決。
單例模式總結:
以下是實現過程:
我的MDI程序子窗體(用戶管理--UserMgrForm)
private static UserMgrForm UsrForm; //子窗體實例
private static readonly Object asyncRoot = new Object(); //只讀的object對象
//構造函數
private UserMgrForm()
{
InitializeComponent();
}
//子窗體創建實例的方法(必須是靜態,因為不允許用類實例調用實例方法,那樣就沒意義了)
public static UserMgrForm GetInstance()
{
if (UsrForm == null)
{
lock (asyncRoot) //這個是用在多線程程序下的雙鎖
{
//判斷子窗體實例是否為null
if (UsrForm == null)
{
UsrForm = new UserMgrForm();
}
}
}
return UsrForm;
}
//修改子窗體UserMgrForm.Designer.cs文件中的代碼為
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
//base.Dispose(disposing); //原來的代碼
base.Hide();
}
//那麼在主窗體中如何實現打開子窗體呢:
//用戶管理
private void miEmpMgr_Click(object sender, EventArgs e)
{
SysMenu.UserMgrForm.GetInstance().MdiParent = this;
SetUI.SetFormTitle(SysMenu.UserMgrForm.GetInstance(), "用戶管理"); //窗體標題
SetUI.SetMdiChildSize(SysMenu.UserMgrForm.GetInstance()); //設置子窗體初始尺寸
SetUI.SetMdiFormState(SysMenu.UserMgrForm.GetInstance()); //設置子窗體狀態
SysMenu.UserMgrForm.GetInstance().Show(); //顯示子窗體
}
單例模式還有幾種寫法,這裡就不一一些出來了。