說說我學習單例模式的原因 :
在做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(); //顯示子窗體 }
單例模式還有幾種寫法,這裡就不一一些出來了。