设计模式——单例模式

最近一直在研究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();

     }

即可完成单例模式。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值