说说我学习单例模式的原因 :
在做MDI WinForm程序的时候,需要每个子窗体只能打开一次(同时只能有一个子窗体实例),之前网上看到好多种解决方案,各种尝试都解决不了我遇到的问题,相信很多人跟我一样,现在可以告诉大家,单利模式可以完美解决。
单例模式总结:
- 目标:一个类只能有一个实例存在
- 类的实例通过自身来创建
- 由于类实例只能有一个,所以类的构造函数必须是private的
- 类内部必须有一个逻辑单元来返回给外部一个类实例(对象)
以下是实现过程:
我的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(); //显示子窗体
}
单例模式还有几种写法,这里就不一一些出来了。
原标题:.NET设计模式之单例模式
关键词:.NET