最近一直在研究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();
}
即可完成单例模式。