最近一直在研究pda应用程序开发,将近一个月的时间,已初步掌握WIndows Mobile6.0操作系统下基于.Net Compact Framework3.5的应用程序开发流程。

今天使用单例模式解决了应用程序窗口重复创建的问题,跟大家分享下经验。

问题背景:

首先,我建立了一个智能设备应用程序,只有“登录”和“功能选择”两个窗体。其次,功能选择界面包括“功能一”,“功能二”,。。。。。。,“重新登录”,以及“退出系统”等几个功能按钮。

问题出在“重新登录”功能按钮以及登录界面的”登录“按钮,“重新登录”按钮点击事件,实现以下代码:

FmLogin fmRelogin = new FmLogin();

fmRelogin.ShowDialog();//重新创建登录页面

”登录“按扭点击事件,实现以下代码:

FmFunctionChoose fmFunctionChoose = new FmFunctionChoose();

fmFunctionChoose.ShowDialog();//重新创建功能选择界面

this.close();//关闭登陆界面

this.visualble();//隐藏(不晓得为什么不隐藏在任务管理器中即使关闭窗口,依然可见进程)

这样我反复几次点击重新登录并登录出现功能选择界面后,任务管理器出现正在运行的”功能选择“有十几个之多。

在参考《大话设计模式》之后,采取了以下解决方法:

1.将点击按钮时声明的FmLogin对象,放在类的全局变量中完成,这样就可以去判断这个变量是否被实例化过;

eg:private FmLogin fmLogin = null;

     private void btnLogin_Click(object sender,EventArgs e)

     {

         //询问是否已创建实例

         //"实例化与否的过程就和报告交了与否的过程一样,应该有自己来判断,这是自己的责任,而不是别人的责任。别人只是使用它"——《大话设计模式》

         //"通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让自身负责保存它唯一的实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法"——《大话设计模式》

         //就是说在判断实例创建与否时,应将此过程交予需要调用的窗口,来判断自己是否已经被实例化过

     }

2.使外部程序无法用new来实例化FmFunctionChoose窗口,即将其构造函数修饰符改为private;

3.FmFunctionChoose类内提供公有方法,以便其他外部调用。

eg:public partial class FmFunctionChoose: Form
    {
        private static FmFunctionChoose singleForm;

        private FmFunctionChoose()
        {
            InitializeComponent();
        }

        public static FmFunctionChoose GetSingleForm()
        {
            if (singleForm == null)
            {
                singleForm = new FmMain();
                singleForm.ShowDialog();
            }
            else
            {
                singleForm.Show();
            }
            return singleForm;
        }
}

4.第一步中的单击函数中

     private void btnLogin_Click(object sender,EventArgs e)

     {

         fmLogin = FmLogin.GetSingleForm();

     }

即可完成单例模式。




更多推荐