在开发C#项目的时候往往会遇到这样的场景:整个系统都最小化到托盘,然后用户想要双击托盘显示出主界面,而此时你需要在显示主界面的时候弹出一个验证用户信息的对话框,要求用户输入密码等来验证。这样的场景就意味着你必须对密码验证框进行单一实例,否者你双击一次托盘就显示一次验证框,到最后就会产生不必要的麻烦…
单一模式在《深入浅出设计模式》一书里面算是最最简便的一个模式了,主要是为了防止系统多次实例化窗体。要实现单一模式很简单,有很多种方法:
1、只要把该类的构造函数设置为私有,而且在该类中实例一个该类对象,并在类中做一个静态返回该对象就可以了~~不过这里要注意该对象是否为null或者已经IsDisposed
(例子来自《大话设计模式》中的单例模式)
namespace 单例模式
{
public partial class FormToolbox : Form
{
private static FormToolbox ftb = null;
private FormToolbox() //构造函数声明为私有,所以不能在类外实例对象
{
InitializeComponent();
}
public static FormToolbox GetInstance() //静态方法,返回类对象
{
if (ftb == null || ftb.IsDisposed) //判断是否已经引用了对象或者已经清理掉
{
ftb = new FormToolbox();
ftb.MdiParent=Form1.ActiveForm; //声明该窗体是主窗体的MDI子窗体
}
return ftb; //返回该对象
}
}
}
1) 主窗体:
namespace 单例模式
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.IsMdiContainer = true; //声明该窗体为MDI主窗体
}
private void ToolStripMenuItemToolbox_Click(object sender, EventArgs e)
{
FormToolbox.GetInstance().Show(); //通过调用静态方法返回对象,然后Show()
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
FormToolbox.GetInstance().Show();
}
}
}
2:不对该类做任何的处理,在类外其他地方如果要做单一处理的话,只需要声明一个静态且私有的类对象,然后判断它是否null或者IsDisposed就可以了~如下:
private static FormToolbox ftb; //声明静态的私有类对象
if (ftb == null || ftb.IsDisposed) //判断是否已经引用了对象或者已经清理掉
{
ftb = new FormToolbox();
ftb.ShowDialog();
}
else if (!ftb.Visible)
{
ftb.ShowDialog();
}
ftb.Activate(); //激活该对象
这样在你双击托盘的时候就会弹出数据密码的验证框,假如你再双击托盘则相当于激活了该验证框…