由于最近工作需要用到单实例模式,虽然以前对单实例模式有些了解,但却没有实际应用过,看了也就忘记了。再次熟悉一下:
有时候,我们需要在程序运行整个过程中,为了效率问题或者用户体验,要求只产生对象的一个实例,这时候我们就需要用到单实例模式。
例如:我们想在弹出对话框窗口时,不论用户触发多少次事件,当窗口存在时,只弹出一次。
1:
将弹出窗口Form1作为全局变量声明:Form1 frm1;
在触发弹出窗口事件时判断Form1是否实例化,如果没有,实例化窗口弹出:
if(frm1==null)
{
frm1=new Form();
frm1.show();
}
但这时还是有问题,当我们关闭窗口后,再点击却不能在弹出窗口,因为在关闭窗口时,Form实例并没有为null而只是disposed。
2:
if(frm1==null||frm1.isdisposed)
{
frm1=new Form();
frm1.show();
}
3:为了提高代码的重用性,将方法写成单独一个方法。
public void OpenForm()
{
if(frm1==null||frm1.isdisposed)
{
frm1=new Form();
frm1.show();
}
}
4:为了体现代码的封装性,我们将对窗口的实例化写进需要弹出的窗体中。
private static Form1 frm1=null;
private Form1()
{
InitializeComponent();
}
//构造方法私有,外部代码不能通过new来实例化。
public static Form1 GetInstance()
{
if(frm1==null||frm1.isdisposed)
{
frm1=new Form();
}
return frm1;
}
到此,我们再总结一下:什么是单例模式?就是一个类只有一个实例,并提供一个访问它的全局访问点。
如何才能是一个全局变量被访问并且防止被实例化为多个对象?最好的方法是让类负责保存它的唯一实例,这个类可以保证没有其他的类可以创建,并且提供一个公共方法访问该实例。