你的位置:首页 > ASP.net教程

[ASP.net教程].NET设计模式之单例模式


  说说我学习单例模式的原因 :

  在做MDI WinForm程序的时候,需要每个子窗体只能打开一次(同时只能有一个子窗体实例),之前网上看到好多种解决方案,各种尝试都解决不了我遇到的问题,相信很多人跟我一样,现在可以告诉大家,单利模式可以完美解决。

  单例模式总结:

  1. 目标:一个类只能有一个实例存在
  2. 类的实例通过自身来创建
  3. 由于类实例只能有一个,所以类的构造函数必须是private的
  4. 类内部必须有一个逻辑单元来返回给外部一个类实例(对象)

  以下是实现过程:

  我的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(); //显示子窗体
        }

   单例模式还有几种写法,这里就不一一些出来了。